【问题标题】:Convert string to double with 2 digit after decimal separator将字符串转换为带小数点分隔符后 2 位数字的双精度
【发布时间】:2010-12-07 23:07:03
【问题描述】:

一切都始于这些简单的代码行:

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

结果应该是 1690.0,但不是。 d 等于 1689.9999999999998。 我想要做的就是在小数点分隔符后用 2 位数字舍入一个双精度值。 这是我的功能。

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

还有其他更“优雅”的解决方案吗,我对这个不太满意。

【问题讨论】:

  • 又一天,另一个人在浮点上失败了:(
  • 这看起来也是一个重复的问题。不知道我记得在哪里看到的。
  • 这是很常见的事情,所以这个网站上肯定有几个重复的。但我认为找到它们比仅仅回答要付出更多的努力,所以很好。 :)

标签: c# .net compact-framework double type-conversion


【解决方案1】:
Math.Round(number, 1)

编辑我问错了问题 - 舍入问题是浮点类型(float、double)固有的。您应该为此使用小数。

【讨论】:

    【解决方案2】:

    双打不能完全代表 16.9。我建议您将其转换为decimal

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

    您可能只想继续使用decimal 而不是double,因为您说您会将其用于货币目的。请记住,decimal 旨在准确表示符合其精度的十进制数,而double 将仅准确表示符合其精度的二进制数。

    【讨论】:

      【解决方案3】:

      不发疯的最佳解决方案是: 字符串 s = "16.9";

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

      四舍五入: Convert.ToDouble((d).ToString("F2"));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多