一尘不染

舍入错误?

java

在我的课程中,我被告知:

连续值大约在内存中表示,因此使用浮点数进行计算会产生舍入误差。这些是位模式的微小差异。因此,e==f如果ef为浮点,则测试是不安全的。

指的是Java。

这是真的?我已经将比较语句与doubles和floats一起使用,并且从未遇到过舍入问题。我从来没有读过类似的教科书。虚拟机肯定占了这一切吗?


阅读 259

收藏
2020-09-08

共1个答案

一尘不染

是真的。

这是如何在内存中以有限数量的位表示浮点值的固有限制。

例如,该程序显示“ false”:

public class Main {
  public static void main(String[] args) {
    double a = 0.7;
    double b = 0.9;
    double x = a + 0.1;
    double y = b - 0.1;
    System.out.println(x == y);
  }
}

通常,您不决定与’==’进行精确比较,而是询问数字是否足够“接近”:

System.out.println(Math.abs(x - y) < 0.0001);
2020-09-08