java中BigDecimal的equals与compareTo的区别

2018-01-16 12:53:08来源:oschina作者:Idea人点击

1、源码比较

1）BigDecimal的equals方法：

public boolean equals(Object x){
if (!(x instanceof BigDecimal))
return false;
BigDecimal xDec = (BigDecimal) x;
return scale == xDec.scale && intVal.equals(xDec.intVal);
}

2）compareTo方法

public int compareTo(BigDecimal val){
/* Optimization: would run fine without the next three lines */
int sigDiff = signum() - val.signum();
if (sigDiff != 0)
return (sigDiff > 0 ? 1 : -1);
/* If signs match, scale and compare intVals */
BigDecimal arg[] = new BigDecimal[2];
arg[0] = this; arg[1] = val;
matchScale(arg);
return arg[0].intVal.compareTo(arg[1].intVal);

matchScale的实现如下：

private static void matchScale(BigDecimal[] val) {
if (val[0].scale < val[1].scale)
val[0] = val[0].setScale(val[1].scale);
else if (val[1].scale < val[0].scale)
val[1] = val[1].setScale(val[0].scale);
}

System.out.println(new BigDecimal("1.2").equals(new BigDecimal("1.20")));//输出false
System.out.println(new BigDecimal("1.2").compareTo(new BigDecimal("1.20")) == 0); //输出true

System.out.println(new BigDecimal(1.2).equals(new BigDecimal("1.20"))); //输出是false
System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal("1.20")) == 0); //输出是false

System.out.println(new BigDecimal(1.2).equals(new BigDecimal(1.20))); //输出是true
System.out.println(new BigDecimal(1.2).compareTo(new BigDecimal(1.20)) == 0);//输出是true

BigDecimal类型变量比较大小时用compareTo方法，判断变量值是否为0，与BigDecimal.ZERO比较大小。
BigDecimal作除法时，除了要考虑除数是否为0，更要考虑是否能除尽的问题，直接调用BigDecimaldivide(BigDecimal divisor, int scale, int roundingMode)方法做除法可以避免除不尽的问题。