2009-10-19 88 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”));

相关问题