闲话不多说 , 直接上代码
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 不相同 , 经过几层处理 , 最终还是转成整数之后的值进行比较