代码之家  ›  专栏  ›  技术社区  ›  Fakrudeen

你能把浮点值精确地与零比较吗?

  •  24
  • Fakrudeen  · 技术社区  · 16 年前

    我知道我们不能用==比较两个浮点值。我们只能比较它们之间的距离。 我知道

    if(val == 0.512)
    

    是错误的,因为浮点计算和转换为二进制和

    if (val in (0.512-epsilon, 0.512+epsilon))
    

    但是0是特别的吗?我们能将浮点数精确地与0进行比较吗?或者这是不正确的?特别是在C#和Java的环境中?

    double val = 0;
    val = getVal();
    if(val == 0)
    
    8 回复  |  直到 16 年前
        1
  •  17
  •   Bart Kiers    16 年前

    即使0具有精确的表示形式,也不能依赖使用浮点的计算结果精确为0。正如您所指出的,这是由于浮点计算和转换问题造成的。

        2
  •  13
  •   Calmarius    16 年前

    如果将变量赋值为零,则可以将其与零进行比较。如果你从减法中得到零,你仍然可以得到一个非常小的接近零的数字。例如:0.1-0.1可能会演变为1e-9。

        3
  •  13
  •   b.roth    16 年前

    使用 容忍 /ephsilon方法。

    我刚刚用Java计算了以下内容,从数学上讲结果为零:

    1.0/5.0 + 1.0/5.0 - 1.0/10.0 - 1.0/10.0 - 1.0/10.0 - 1.0/10.0
    

    2.7755575615628914E-17
    
        4
  •  4
  •   Peter Lawrey    16 年前

    // compare a and b with an ERR error.
    if (Math.abs(a - b) <= ERR)
    

    与0比较

    // compare a and 0 with an ERR error.
    if (Math.abs(a) <= ERR)
    
        5
  •  3
  •   Peter Westlake    16 年前

        6
  •  2
  •   duffymo    16 年前

    我仍然建议遵循宽容的习惯用法,而不是精确地与零比较。

        7
  •  0
  •   Jackson    16 年前

        8
  •  0
  •   kizzx2    15 年前

    在任何非平凡的情况下,您实际上应该只使用容忍方法。如前所述,零比较只有在实际将其指定为零时才准确。

    我不想重复其他人说过的话,我只想强调一个事实,即使用宽容的方法更有效 . 你曾经认为是一个简单的作业,以后可能会涉及实际的算术。使用赤裸裸的比较会让以后的调试变得非常困难。