对于不相等的值,相等运算符返回 true

Jok*_*ker 1 java equality

我有两个类型为 和 的变量 y 和doublez long。我的问题是,即使它们具有不相等的值,相等运算符也会为它们返回 true,如下面的代码片段所示:

public class Test {
    public static void main(String[] args) throws Exception {
        double y = (double) Long.MAX_VALUE;
        System.out.println(y);//9.223372036854776E18
        long z = Long.MAX_VALUE - 1;
        System.out.println(z);//9223372036854775806
        System.out.println(y == z);//=============true
    }
}
Run Code Online (Sandbox Code Playgroud)

我的疑问是,如果 z 的值小于 y,为什么y==z返回 true?

有人可以解释这种行为吗?

ken*_*ytm 5

这里发生了两件事。

  1. 在中double == longlong被提升为。double该表达式的y == z计算结果与 相同(double) Long.MAX_VALUE == (double) (Long.MAX_VALUE - 1)

  2. double只有 53 位精度。将 long > 2 53转换为 double 时,最低有效位将被舍入,使(double) Long.MAX_VALUE(= 2 63 - 1)(double) (Long.MAX_VALUE - 1)成为相同的值。


And*_*ner 5

为了评估y == z,Java必须提升z到double。

一些大于的长值2^53 - 1无法用双精度值精确表示。

(double) Long.MAX_VALUE 确实equal (double) (Long.MAX_VALUE - 1),因为 double 没有足够的精度来明确表示两个值。

您可以使用以下命令查看所需的增量(如 中所示Long.MAX_VALUE - delta)以获得不同的浮点值Math.nextDown

double delta = y - Math.nextDown(y);
Run Code Online (Sandbox Code Playgroud)

得到 1024。