为什么Double.compare()将数字比较两次

时间:2016-03-02 21:19:54

标签: java double

我在调试模式下通过Double.compare()查看F5实现(复制粘贴)

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

    // Cannot use doubleToRawLongBits because of possibility of NaNs.
    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)
}

我期待像

这样的东西
public static int compare(double d1, double d2) {
    if (d1 < d2)
        return -1;
    if (d1 > d2)
        return 1;
    return 0;
}

但是,该方法不是return 0;,而是将双精度转换为位,如果其中一个比另一个大,则再次进行比较

thisBits < anotherBits ? -1 : 1);

为什么第二次比较的冗余?

1 个答案:

答案 0 :(得分:5)

如果d1是某个数字,例如0.0d2NaN,则d1 < d2将为false,d1 > d2是假的,但这不会使NaN等于d1。此外,如果d1-0.0d20.0,则d1 < d2将为false,而d1 > d2将为 也是假的,但0.0应该大于-0.0

评论非常清楚。