在Java中比较双精度会得到奇怪的结果
2022-09-04 06:17:02
我真的可以弄清楚为什么会发生以下情况:
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
我很确定这在某种程度上与自动装箱有关,但我真的不知道为什么当使用==
运算符和调用.equals
时,0
会以不同的方式装箱。
这难道不是隐含地违反了合同吗?equals
* It is reflexive: for any non-null reference value * x, x.equals(x) should return * true.
编辑:
感谢您的快速回答。我认为它的盒装方式不同,真正的问题是:为什么它的盒装方式不同?我的意思是,如果这比直觉和预期更直观,但是如果哪个看起来像一个比“直观地”也应该是真的。d == 0d
d.equals(0d)
d == 0
Integer
true
d.equals(0)