舍入错误?

2022-09-01 13:30:52

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

连续值近似地表示在内存中,因此使用浮点数进行计算涉及舍入误差。这些是位模式的微小差异;因此,如果 和 是浮子,则该测试是不安全的。e==fef

参考Java。

这是真的吗?我使用过与 s 和 s 的比较语句,并且从未遇到过舍入问题。我从来没有在教科书上读到过类似的东西。当然,虚拟机对此负责?doublefloat


答案 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);

答案 2

这适用于Java,就像任何其他使用浮点的语言一样。它是硬件中浮点值表示的设计所固有的。

有关浮点值的详细信息:

每个计算机科学家都应该知道的浮点算术