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); } } |
下面是输出:
我想继续添加0.01(如您在屏幕上看到的,有时它碰巧添加0.99999)谢谢
如果你想保持这种准确性,就用
浮点类型不能准确表示某些值。我建议阅读每一个计算机科学家应该知道的关于浮点运算的内容,以获得全面的解释。
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); } } |