2009-10-19 87 views
4

一切都始於這些代碼簡單的線條後:字符串轉換爲與2位數字的兩倍小數點分隔

string s = "16.9"; 
double d = Convert.ToDouble(s); 
d*=100; 

結果應該是1690.0,但事實並非如此。 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; 
    } 

但是,同樣的問題,從字符串轉換爲double不起作用,因爲我想。 解決此問題的方法是將「00001」連接到字符串,然後使用Math.Round函數(在上面的示例中進行了註釋)。

該雙倍值乘以100(作爲整數)發送到設備(收銀機),並且此值必須正確。

我使用VS2005 + .NET CF 2.0

是否有另一個更「優雅」的解決方案,我不滿意這點之一。

+7

另一天,另一個人浮點失敗:( – leppie 2009-10-19 10:46:53

+0

它看起來像一個重複的問題。不知道我記得我在哪裏看到它。 – 2009-10-19 10:48:33

+1

這是一個很常見的事情,所以一定會有幾個重複在這個網站上,但我認爲找到它們更有效,而不僅僅是爲了回答,所以很好。:) – Joren 2009-10-19 11:14:55

回答

12

雙打不能完全代表16.9。我建議你將其轉換爲decimal代替:

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

double d = (double)m; 

你可能只是想利用decimal代替double,既然你說你會使用它的貨幣的目的,以保持。請記住,decimal旨在精確地表示符合其精度的十進制數,而double只能精確地表示二進制數。

1
Math.Round(number, 1) 

編輯我得到了錯誤的問題 - 四捨五入問題是固有的浮點型(浮動,雙)。你應該爲此使用小數。

+0

不是真的,圓形會在數量上乘以100。 – leppie 2009-10-19 11:22:12

1

最好的解決方案不要瘋了: string s =「16.9」;

對於/。 double d = Convert.ToDouble(s.Replace(',','。'),System.Globalization.CultureInfo.InvariantCulture);

四捨五入: Convert.ToDouble((d).ToString(「F2」));

相關問題