Java签署零和拳击

uhz*_*uhz 34 java double boxing

最近我用Java编写了一个项目,发现了一个非常奇怪的功能,包括double/Double实现.Java中的double类型有两个0,即0.0和-0.0(有符号零).奇怪的是:

0.0 == -0.0
Run Code Online (Sandbox Code Playgroud)

评估true,但是:

new Double(0.0).equals(new Double(-0.0))
Run Code Online (Sandbox Code Playgroud)

评估为false.有谁知道这背后的原因?

ass*_*ias 43

这一切都在javadoc中解释:

请注意,在大多数情况下,对于Double,d1和d2类的两个实例,d1.equals(d2)的值为true,当且仅当

   d1.doubleValue() == d2.doubleValue() 
Run Code Online (Sandbox Code Playgroud)

也有值true.但是,有两个例外:

  • 如果d1和d2都表示Double.NaN,则equals方法返回true,即使Double.NaN == Double.NaN的值为false.
  • 如果d1表示+0.0而d2表示-0.0,反之亦然,则等值测试的值为false,即使+0.0 == - 0.0的值为true.

此定义允许哈希表正常运行.


现在你可能会问为什么0.0 == -0.0是真的.实际上它们并不完全相同.例如:

Double.doubleToRawLongBits(0.0) == Double.doubleToRawLongBits(-0.0); //false
Run Code Online (Sandbox Code Playgroud)

是假的.但是,JLS要求(" 根据IEEE 754标准的规则 "):

正零和负零被认为是相等的.

因此0.0 == -0.0是真的.

  • 并且JLS要求因为IEEE 754需要它. (2认同)