使用十进制分隔符将字符串转换为带有2位小数的双精度浮点数

5
一切始于这几行简单的代码:
string s = "16.9";
double d = Convert.ToDouble(s);
d*=100;

结果应该为1690.0,但实际上不是。d等于1689.9999999999998。我想做的就是将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函数(在上面的示例中已注释)。
将该double值乘以100(作为整数)发送到设备(收银机),并且这些值必须正确。
我正在使用VS2005 + .NET CF 2.0。
是否有另一种更“优雅”的解决方案?我对这个解决方案不满意。

7
又是一天,又有人因为浮点数出错而失败 :( - leppie
这似乎也是一个重复的问题。我不确定我记得在哪里看到它了。 - user114600
1
这是一个非常普遍的问题,所以在这个网站上肯定会有很多重复的答案。但我认为找到它们比回答问题更费劲,所以还是直接回答吧。 :) - Joren
3个回答

13

双精度浮点数无法精确表示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)

编辑 我弄错了问题 - 四舍五入问题与浮点类型(float、double)本质相关。你应该使用decimal。


1
最好的不疯狂解决方案是: string s = "16.9";
对于 ,/. double d = Convert.ToDouble(s.Replace(',','.'),System.Globalization.CultureInfo.InvariantCulture);
对于四舍五入: Convert.ToDouble((d).ToString("F2"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接