无尽的循环与浮动

时间:2016-04-06 07:35:51

标签: c# .net floating-point increment

请考虑以下代码:

for (float i = 0f; i < int.MaxValue; i++)
{
    // Some code
}

应该从0循环到int.MaxValue(2 31 -1),但事实并非如此。一旦i达到2 24 i++不再有效,原因是我完全无法理解。

在VS的立即窗口中,我试试这个:

>i
16777216.0
>i + 1
16777216.0 // ???
>i == i + 1
false // as expected, but a lack of consistency with upper statement
>i + 2
16777218.0

为什么会这样? 2 24 +1?

的特殊之处

1 个答案:

答案 0 :(得分:13)

这是因为浮动精度。它基于IEEE浮点运算标准(IEEE 754)。阅读它以了解浮点的工作原理。

简单来说,当浮点数本身存储一个大值时;当前存储的数字与它可以存储的下一个数字之间的差异大于1,因此向它添加1并不会增加它的值。

如果您需要精确的十进制数,请改用decimal 如果您需要大于int的整数值,请使用long 如果您需要非常大的积分值,请使用BigInteger