gpt4 book ai didi

java - 比较 Java 中的 double 给出奇怪的结果

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:24 25 4
gpt4 key购买 nike

我真的无法理解为什么会发生以下情况:

Double d = 0.0;
System.out.println(d == 0); // is true
System.out.println(d.equals(0)); // is false ?!

然而,这按预期工作:

Double d = 0.0;
System.out.println(d == 0.0); // true
System.out.println(d.equals(0.0)); // true

我肯定这在某种程度上与自动装箱有关,但我真的不知道为什么0== 时,装箱方式会有所不同使用运算符并且何时使用 .equals被称为

这是否隐含地违反了 equals契约(Contract)?

  *  It is reflexive: for any non-null reference value  *     x, x.equals(x) should return  *     true.

编辑:

感谢您的快速回答。我认为它的装箱方式不同,真正的问题是:为什么它的装箱方式不同?我的意思是如果 d == 0d 会更直观比d.equals(0d)是直观的和预期的,但是如果 d == 0看起来像 Integertrue比“直觉”d.equals(0)也应该是真的。

最佳答案

改成

System.out.println(d.equals(0d)); // is false ?! now true

您正在将 double 与 Integer 进行比较0

在幕后

System.out.println(d.equals(0)); // is false ?!

0将被自动装箱到 Integer并且 Integer 的实例将传递给 equals() Double的方法|类,它会比较像

@Override
public boolean equals(Object object) {
return (object == this)
|| (object instanceof Double)
&& (doubleToLongBits(this.value) == doubleToLongBits(((Double) object).value));
}

当然会返回 false

更新

当您使用 == 进行比较时它比较值,因此不需要自动装箱,它直接对值进行操作。在哪里equals()接受 Object所以如果你尝试调用 d1.equals(0) , 0不是 Object,因此它将执行自动装箱并将其打包为 Integer,这是一个 Object。

关于java - 比较 Java 中的 double 给出奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5230642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com