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

问题描述 投票:0回答:2

我有两个类型为

double
long
的变量 y 和 z。我的问题是,即使它们具有不相等的值,相等运算符也会为它们返回 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
    }
}

我的疑问是,如果 z 的值小于 y,为什么

y==z
返回 true? .

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

java equality
2个回答
4
投票

这里发生了两件事。

  1. double == long
    中,
    long
    提升
    double
    。表达式
    y == z
    的计算结果与
    (double) Long.MAX_VALUE == (double) (Long.MAX_VALUE - 1)
    相同。

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


4
投票

为了评估

y == z
,Java 必须将
z
提升为双精度。

任何大于

2^53 - 1
的长值都不能精确地用双精度表示。

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

您可以使用

Long.MAX_VALUE - delta
查看所需的增量(如
Math.nextDown
中所示)以获取不同的浮点值:

double delta = y - Math.nextDown(y);

得出 1024。

© www.soinside.com 2019 - 2024. All rights reserved.