我正在研究实施比较(双倍,双倍) http://java.sun.com/javase/6/docs/api/java/lang/Double.html#compare(double,%20double)Java 标准库 (6)。上面写着:
public static int compare(double d1, double d2) {
if (d1 < d2)
return -1; // Neither val is NaN, thisVal is smaller
if (d1 > d2)
return 1; // Neither val is NaN, thisVal is larger
long thisBits = Double.doubleToLongBits(d1);
long anotherBits = Double.doubleToLongBits(d2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1)); // (0.0, -0.0) or (NaN, !NaN)
}
这种实施有什么优点?
编辑:“优点”是一个(非常)糟糕的词语选择。我想知道这是如何运作的。
解释在代码的注释中。 Java 两者都有双精度值0.0
and -0.0
,以及“不是数字”(NaN
)。你不能使用简单的==
这些值的运算符。浏览一下doubleToLongBits()
来源和在Javadoc 的Double.equals() method http://docs.oracle.com/javase/10/docs/api/java/lang/Double.html#equals%28java.lang.Object%29:
请注意,在大多数情况下,对于两个
类的实例Double
, d1
and d2
,
的价值d1.equals(d2)
is true
如果
并且仅当
d1.doubleValue() == d2.doubleValue()
也有其价值true
。然而,
有两个例外:
- If
d1
and d2
两者都代表Double.NaN
,然后 equals 方法返回true
, 甚至
尽管Double.NaN == Double.NaN
有价值false
.
- If
d1
代表+0.0
while d2
代表-0.0
,反之亦然,相等测试具有值false
, 虽然+0.0 == -0.0
有价值true
.
这个定义允许哈希表正常运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)