2009-10-19 4 views
4

모든 코드의 간단한 라인을 시작했다 소수 구분 후 2 자리와 두 배로. d는 1689.9999999999998과 같습니다. 소수 자릿수 뒤에 2 자리 숫자로 double 값을 반올림하면됩니다. 내 기능은 다음과 같습니다. 변환 문자열은

private double RoundFloat(double Value) 
{ 
    float sign = (Value < 0) ? -0.01f : 0.01f; 

    if (Math.Abs(Value) < 0.00001) Value = 0; 

    string SVal = Value.ToString(); 
    string DecimalSeparator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator; 
    int i = SVal.IndexOf(DecimalSeparator); 
    if (i > 0) 
    { 
     int SRnd; 
     try 
     { 
      // вземи втората цифра след десетичния разделител 
      SRnd = Convert.ToInt32(SVal.Substring(i + 3, 1)); 
     } 
     catch 
     { 
      SRnd = 0; 
     } 

     if (SVal.Length > i + 3) 
      SVal = SVal.Substring(0, i + 3); 
     //SVal += "00001"; 

     try 
     { 
      double result = (SRnd >= 5) ? Convert.ToDouble(SVal) + sign : Convert.ToDouble(SVal); 
      //result = Math.Round(result, 2); 
      return result; 
     } 
     catch 
     { 
      return 0; 
     } 
    } 
    else 
    { 
     return Value; 
    } 

그러나 다시 내가 원하는대로 작동하지 않는 두 배로 문자열로 변환 같은 문제,

. 이 문제를 해결하려면 "00001"을 문자열에 연결 한 다음 Math.Round 함수를 사용하십시오 (위의 예제에서 주석 처리 됨).

이 두 값에 100을 곱한 값 (정수)은 장치 (금전 등록기)로 전송되며이 값은 정확해야합니다. 내가 VS2005 + .NET CF를 사용하고

2.0

다른 많은 "우아한"해결책은 나는이 일에 만족하지 않다,이입니다.

+7

또 다른 일, 다른 사람은 그것으로 실행하는 매우 일반적인 일이 – leppie

+0

부동 소수점에 실패, 그래서 몇 가지 중복이있을 바인딩 이 사이트에서.하지만 난 그냥 대답하기보다는 그들을 찾는 더 노력이라고 생각해. :) –

+1

. 내가 봤던 기억 나는 확실하지. 그것은 너무 중복 질문처럼 보인다 :( – Joren

답변

12

더블은 정확히 16.9를 나타낼 수 없습니다. 난 당신이 대신 decimal로 변환 제안 :

string s = "16.9"; 
decimal m = Decimal.Parse(s) * 100; 

double d = (double)m; 

당신은 당신이 금전적 목적을 위해 그것을 사용하고있을거야라고 때문에, 대신 doubledecimal를 계속 사용하려면 단지 수 있습니다. decimal은 정확도에 맞는 십진수를 정확하게 나타내며, double은 정확하게 이진수를 나타냅니다.

1
Math.Round(number, 1) 

편집 내가 잘못된 질문이 있어요 - 반올림 문제는 부동 소수점 형 (플로트, 더블) 고유 있습니다. 이것을 위해서는 십진수를 사용해야합니다.

+0

정말, 라운드 번호 시간에 작동합니다 100 :) – leppie

1

미친 짓을하지 않는 가장 좋은 해결책은 다음과 같습니다. string s = "16.9";

들어, /. double d = Convert.ToDouble (s.Replace (',', '.'), System.Globalization.CultureInfo.InvariantCulture);

반올림의 경우 : Convert.ToDouble ((d) .ToString ("F2"));