我有两个类型为 和 的变量 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?
有人可以解释这种行为吗?
为了评估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。