BigDecimal精度和比较问题
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("300000.00000");
BigDecimal b2 = new BigDecimal("300000.000");
System.out.println("b1 = " + b1.toString() +" 和 b2 = " + b2.toString() + " 的 compareTo 比较结果:" + (b1.compareTo(b2) == 0));
System.out.println("b1 = " + b1.toString() +" 和 b2 = " + b2.toString() + " 的 equals 比较结果:" + b1.equals(b2));
System.out.println("==========================================================");
b1 = b1.setScale(3 , BigDecimal.ROUND_HALF_UP);
System.out.println("b1 = " + b1.toString() +" 和 b2 = " + b2.toString() + " 的 compareTo 比较结果:" + (b1.compareTo(b2) == 0));
System.out.println("b1 = " + b1.toString() +" 和 b2 = " + b2.toString() + " 的 equals 比较结果:" + b1.equals(b2));
}
}
b1 = 300000.00000 和 b2 = 300000.000 的 compareTo 比较结果:true
b1 = 300000.00000 和 b2 = 300000.000 的 equals 比较结果:false
==========================================================
b1 = 300000.000 和 b2 = 300000.000 的 compareTo 比较结果:true
b1 = 300000.000 和 b2 = 300000.000 的 equals 比较结果:true
所以BigDecimal比较的时候要采用compareTo方法
源码
compareTo
public int compareTo(BigDecimal val) {
if (scale == val.scale) {
long xs = intCompact;
long ys = val.intCompact;
if (xs != INFLATED && ys != INFLATED)
return xs != ys ? ((xs > ys) ? 1 : -1) : 0;
}
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
public boolean equals(Object x) {
if (!(x instanceof BigDecimal))
return false;
BigDecimal xDec = (BigDecimal) x;
if (x == this)
return true;
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());
}