代码之家  ›  专栏  ›  技术社区  ›  Thomas Ayoub

带浮点数的无限循环

  •  3
  • Thomas Ayoub  · 技术社区  · 10 年前

    考虑以下代码:

    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 回复  |  直到 10 年前
        1
  •  13
  •   Majid    9 年前

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

    简单地说,当float本身存储了一个大值时;当前存储的数字和它可以存储的下一个数字之间的差值大于1,因此将1添加到它不会增加它的值。

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