写代码碰到一个问题就是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只用来比较值的大小(具体的更深层次的代码,大家可以自己去看一下)