无尽的循环与浮动

Tho*_*oub 3 .net c# floating-point increment

请考虑以下代码:

for (float i = 0f; i < int.MaxValue; i++)
{
    // Some code
}
Run Code Online (Sandbox Code Playgroud)

应该循环0int.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
Run Code Online (Sandbox Code Playgroud)

为什么它会这样?2 24 +1 有什么特别之处?

Ham*_*jam 13

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

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

如果您需要精确的十进制数,请使用十进制.
如果你需要大于int的整数值,那么使用long.
如果需要非常大的整数值,请使用BigInteger.