我有两个类型为
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? .
有人可以解释一下这种行为吗?
这里发生了两件事。
在
double == long
中,long
被提升为double
。表达式 y == z
的计算结果与 (double) Long.MAX_VALUE == (double) (Long.MAX_VALUE - 1)
相同。double
只有 53 位精度。将 long > 253 转换为 double 时,最低有效位将被舍入,使 (double) Long.MAX_VALUE
(= 263 - 1) 和 (double) (Long.MAX_VALUE - 1)
变为相同的值。为了评估
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。