Bigdecimal 的equals 和compare

写代码碰到一个问题就是BigDecimal的比较相等问题。

    public static void main(String[] args) {
        int equals = new BigDecimal("-1").compareTo(new BigDecimal("-1.00000"));
        System.out.println(equals);
    }

上述输出的结果是0

  public static void main(String[] args) {
        boolean equals = new BigDecimal("-1").equals(new BigDecimal("-1.00000"));
        System.out.println(equals);
    }

输出的结果是false

具体去看底层代码:

 @Override
    public boolean equals(Object x) {
        if (!(x instanceof BigDecimal))
            return false;
        BigDecimal xDec = (BigDecimal) x;
        if (x == this)
            return true;
            //两个数据的精确度不一样就会返回false
        if (scale != xDec.scale)
            return false;
        long s = this.intCompact;
        long xs = xDec.intCompact;
        if (s != INFLATED) {
            if (xs == INFLATED)
                xs = compactValFor(xDec.intVal);
            return xs == s;
        } else if (xs != INFLATED)
            return xs == compactValFor(this.intVal);

        return this.inflated().equals(xDec.inflated());
    }
 public int compareTo(BigDecimal val) {
        // Quick path for equal scale and non-inflated case.
        if (scale == val.scale) {
            long xs = intCompact;
            long ys = val.intCompact;
            if (xs != INFLATED && ys != INFLATED)
                return xs != ys ? ((xs > ys) ? 1 : -1) : 0;
        }
        //方法signum返回数据的正负号 -1 负数 0 就是0 1就是正数
        int xsign = this.signum();
        int ysign = val.signum();
        if (xsign != ysign)
            return (xsign > ysign) ? 1 : -1;
        if (xsign == 0)
            return 0;
        int cmp = compareMagnitude(val);
        return (xsign > 0) ? cmp : -cmp;
    }

从代码中可以看出equals方法不仅会比较值的大小,还会比较两个bigdecimal对象的的精确度,compare只用来比较值的大小(具体的更深层次的代码,大家可以自己去看一下)

发布了30 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/syr1136877833/article/details/99418958
今日推荐