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,当且仅当
Run Code Online (Sandbox Code Playgroud)d1.doubleValue() == d2.doubleValue()也有值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是真的.
| 归档时间: |
|
| 查看次数: |
13719 次 |
| 最近记录: |