请考虑以下代码:
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?
的特殊之处答案 0 :(得分:13)
这是因为浮动精度。它基于IEEE浮点运算标准(IEEE 754)。阅读它以了解浮点的工作原理。
简单来说,当浮点数本身存储一个大值时;当前存储的数字与它可以存储的下一个数字之间的差异大于1,因此向它添加1并不会增加它的值。
如果您需要精确的十进制数,请改用decimal 如果您需要大于int的整数值,请使用long 如果您需要非常大的积分值,请使用BigInteger。