转换字符串,小数点后2位翻番(Convert string to double with 2 dig

2019-08-20 07:46发布

一切都开始这些代码简单的线条:

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

是否有另一个更“优雅”的解决方案,我不满意这点之一。

Answer 1:

双打不能完全代表16.9。 我建议你将其转换为decimal ,而不是:

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

double d = (double)m;

你可能只是想利用保持decimal ,而不是double的,因为你说你会使用它的货币的目的。 请记住, decimal旨在准确地表示,适合在其精度十进制数,而double只会完全代表二进制数字做。



Answer 2:

Math.Round(number, 1)

编辑我得到了错误的问题-四舍五入问题是固有的浮点型(浮动,双)。 你应该使用十进制这一点。



Answer 3:

对于不会是疯了最好的解决办法是:字符串s =“16.9”;

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

四舍五入:Convert.ToDouble((d)的ToString( “F2”));



文章来源: Convert string to double with 2 digit after decimal separator