如何使双打正常工作?

How to make doubles work properly? c#

代码如下:

1
2
3
4
5
6
7
8
9
10
    static void Main(string[] args)
    {
        int xd2 = 5;

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

    }

下面是输出:enter image description here

我想继续添加0.01(如您在屏幕上看到的,有时它碰巧添加0.99999)谢谢


如果你想保持这种准确性,就用decimal

浮点类型不能准确表示某些值。我建议阅读每一个计算机科学家应该知道的关于浮点运算的内容,以获得全面的解释。

1
2
3
4
5
6
decimal xd2 = 5m;

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


不,双打就是这样…尝试改用十进制

1
2
3
4
5
6
 int xd2 = 5;

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

如果你想坚持使用双精度,但只注意小数点后两位,请使用…

1
2
3
4
5
6
int xd2 = 5;

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


这是因为double是浮点指针,而这个算法并不精确。您可以使用十进制,如下所示:

1
2
3
4
5
6
7
8
9
10
 static void Main(string[] args)
    {
        int xd2 = 5;

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

同样参见本文:在.NET上的双精度问题


如果可能,应始终使用绝对值而不是迭代计算来消除这些舍入误差:

1
2
3
4
5
6
7
8
public static void Main(string[] args)
{
    int xd2 = 5;

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