2012-03-29 5 views
7

C#에서는 반올림없이 이중의 마지막 두 소수 자릿수를 가져 오려고합니다. 나는 Math.Floor에서 Math.Truncate까지 모든 것을 시도했지만 아무런 효과가 없다. 결과반올림하지 않고 마지막 2 소수점 자리 가져 오기

샘플 내가 좋아하는 것 :

1,424.2488298 -> 1,424.24 
53.5821 -> 53.58 
10,209.2991 -> 10,209.29 

어떤 아이디어?

+1

당신이 경우 * decimal *에서 작업을하고 * decimal *을 사용할 수있을 때 * double *을 사용하는 이유는 무엇입니까? –

+0

이 게시물로 이동하여 적합한 정보를 찾을 수 있습니다. http://how-to-code-net.blogspot.ro/2012/09/how-to-format-number-to-x-decimal.html –

답변

22

음, 수학적으로는 간단합니다

var f = 1.1234; 
f = Math.Truncate(f * 100)/100; // f == 1.12 

이동, 잘라 왼쪽 두 곳으로 다시 이동하는 int로 캐스트 오른쪽에 소수점 두 곳. 프레임 워크에서이 작업을 수행하는 방법이있을 수 있지만 지금은 볼 수 없습니다. 당신은 그것을 일반화 수 :

double Truncate(double value, int places) 
{ 
    // not sure if you care to handle negative numbers...  
    var f = Math.Pow(10, places); 
    return Math.Truncate(value * f)/f; 
} 
+0

그리 간단하지는 않습니다. double은 int보다 큰 범위를 유지합니다. – Joe

+0

@ joe : 아, 좋은 지적이지만, 대신 Math.Truncate를 사용하십시오. 캐스트가 필요하지 않습니다. –

+0

@EdS. 첫 번째 방법을 사용하여 136.2025 값을 시도하고 136.2로 트리밍 및 0 떨어 뜨 렸습니다. 거기에 0을 유지하는 방법 있는가? – mint

5
double d = Math.Truncate(d * 100)/100; 
2

일반적인 솔루션 :

public static double SignificantTruncate(double num, int significantDigits) 
    { 
     double y = Math.Pow(10, significantDigits); 
     return Math.Truncate(num * y)/y; 
    } 

그런 다음

double x = 5.3456; 
    x = SignificantTruncate(x,2); 

원하는 결과 x=5.34를 생성합니다.

14

내 조언 : 처음 사용시 double을 사용 중지합니다.. 소수점 이하 반올림이 필요한 경우 확률은 decimal이어야합니다. 귀하의 신청서는 무엇입니까?

당신이 이중이있는 경우, 당신은 이런 식으로 작업을 수행 할 수 있습니다 이중의 절대 값이 792281625142643375935439504보다 큰 경우 (100)에 의해 곱셈이 실패하기 때문에이 기술이 실패합니다

double r = whatever; 
decimal d = (decimal)r; 
decimal truncated = decimal.Truncate(d * 100m)/100m; 

하는 것으로 . 큰 값을 처리해야하는 경우 특수 기술을 사용해야합니다. (물론, 시간에 의해 이중 대형, 당신은 어쨌든 소수점 이하 두 자리 값을 표현하는 능력을 넘어도있다한다.)

2
Math.Round(NumberToRound - (double)0.005,2) 

Math.Round(53.5821 - (double)0.005,2) // 53.58 
Math.Round(53.5899 - (double)0.005,2) // 53.58 
Math.Round(53.5800 - (double)0.005,2) // 53.58 
관련 문제