BigDecimal的equals精度比较

闲话不多说 , 直接上代码

BigDecimal b1 = new BigDecimal("2.00");
BigDecimal b2 = new BigDecimal("2.0");
System.out.println("----"+b1.equals(b2));  // 输出false
System.out.println("--compareTo--"+b1.compareTo(b2)); // 输出0 表示相等

如果你只是想解决问题 , 那你用compareTo就可以了 , 想了解原因的同志们 , 请往下看

原因 : BigDecimal的不同构造函数 , 有一个不同的scale , 而比较的时候 , 还先比较scale , 所以在调用equals进行比较的时候就有问题了 , 不通的构造函数 ,scale取值如下 :

BigDecimal(int)     scale = 0
BigDecimal(long)    scale = 0
BigDecimal(double)  scale = 0
BigDecimal(String)  scale (等于小数位的位数)

亲身实践 : 

BigDecimal b1 = new BigDecimal("2.00");
BigDecimal b2 = new BigDecimal("2.0");
BigDecimal b3 = new BigDecimal(2.00);
BigDecimal b4 = new BigDecimal(2.0);
System.out.println("--b1--"+b1.scale()); // 输出2
System.out.println("--b2--"+b2.scale());// 输出1
System.out.println("--b3--"+b3.scale());// 输出0
System.out.println("--b4--"+b4.scale());// 输出0

equals方法源码 :

public boolean equals(Object x) {
        if (!(x instanceof BigDecimal))
            return false;
        BigDecimal xDec = (BigDecimal) x;
        if (x == this) 
            return true;
        if (scale != xDec.scale) // 先比较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());
    }

所以在使用equals比较的时候 , 要注意你使用的是哪种BigDecimal的构造函数 , 如果想避免 , 那你就使用compareTo , 然后根据返回值就能知道是否相等 .....

compareTo 其实也有sacle 比较 , 哈哈哈.....那为什么不同的sacle还能能比较出来值是否相等呢?

上源码: 

public int compareTo(BigDecimal val) {
        // Quick path for equal scale and non-inflated case.
        if (scale == val.scale) { // 先比较sacle , 如果相同 , 转而比较他们的整数部分值
            long xs = intCompact; // 根据sacle有几位 , 把原来的值乘以10的n次幂 , 返回整数比较
            long ys = val.intCompact;
            if (xs != INFLATED && ys != INFLATED)
                return xs != ys ? ((xs > ys) ? 1 : -1) : 0;
        }
        int xsign = this.signum(); // 正数返回1 , 负数返回-1 , 0返回0
        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;
    }

compareTo会优先比较sacle , 如果相同 , 会乘以10的n次幂 , 把小数转成整数进行比较

如果sacle 不相同 , 经过几层处理 , 最终还是转成整数之后的值进行比较

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值