如何使双打正常工作? C#(How to make doubles work properly?

2019-09-17 09:50发布

下面的代码:

    static void Main(string[] args)
    { 
        int xd2 = 5;

        for (double xd = (double)xd2; xd <= 6; xd += 0.01)
        {
            Console.WriteLine(xd);
        }

    }

和这里的输出:

我想保持增加0.01(你可以在屏幕上看到,有时会发生增加0.99999)谢谢

Answer 1:

使用decimal ,如果你想保持这种精度。

浮点类型不能准确地表示特定的值。 我建议您阅读什么每台计算机科学家应该知道关于浮点运算进行了全面的解释。

decimal xd2 = 5m;

for (decimal xd = xd2; xd <= 6m; xd += 0.01m)
{
    Console.WriteLine(xd);
}


Answer 2:

号这就是双打如何工作....尝试使用小数代替

 int xd2 = 5;

 for (decimal xd = (decimal)xd2; xd <= 6; xd += 0.01M)
 {
     Console.WriteLine(xd);
 }

如果你想坚持双打,而只关心到小数点后两位用...

int xd2 = 5;

for (double xd = (double)xd2; xd <= 6; xd += 0.01)
{
   Console.WriteLine(Math.Round(xd,2));
}


Answer 3:

这是因为双为float指着这个算法是不准确的。 您可以使用小数代替,就像这样:

 static void Main(string[] args)
    {
        int xd2 = 5;

        for (decimal xd = (decimal)xd2; xd <= 6; xd += 0.01M)
        {
            Console.WriteLine(xd);
        }
        Console.ReadLine();
    }

看到这篇文章太: 在.NET双精度问题



Answer 4:

如果可能的话,你应该总是用绝对的,而不是迭代计算来摆脱这些类型的舍入误差的:

public static void Main(string[] args)
{
    int xd2 = 5;

    for (int i = 0; i < 100; ++i) {
        Console.WriteLine(xd2 + i * 0.01);
    }
}


文章来源: How to make doubles work properly? c#
标签: c# double