将字符串转换为double,小数点分隔符后为2位数

时间:2009-10-19 10:45:19

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

所有这些都是从这些简单的代码行开始的:

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

结果应该是1690.0,但事实并非如此。 d等于1689.9999999999998。 我想要做的就是将一个double加倍到小数位分隔符后的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

还有另一个更“优雅”的解决方案,我对此不满意。

3 个答案:

答案 0 :(得分:13)

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

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

double d = (double)m;

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

答案 1 :(得分:1)

Math.Round(number, 1)

编辑我得到了错误的问题 - 舍入问题是浮点类型(float,double)所固有的。你应该使用十进制数。

答案 2 :(得分:1)

不要疯狂的最佳解决方案是: string s =“16.9”;

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

对于舍入: Convert.ToDouble((d)的ToString( “F2”));