Java浮点数比较 - 以double为例

2022-10-30 14:41:53 浏览数 (2)

Java中浮点数的比较
  • 普通>和<在比较时可能出现的问题
  • Double.compare()源码

普通>和<在比较时可能出现的问题

  通常,我们直接使用<>对数字进行比较。但是在用这些符号进行浮点数比较时,不够严谨(NaN、0.0、-0.0,详见IEEE754标准)。建议使用Double.compare()Float.compare()进行比较。

Double.compare()源码

代码语言:javascript复制
    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)
    }

  源码将浮点数转化为long类型的位序列,并根据IEEE754标准进行大小比较,可以解决0.0、-0.0的比较问题(0.0 > -0.0),以及NaN的问题(NaN永远比!NaN大)。

0 人点赞