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的处理,意思是把精确度低的那个对象转换为高精确度,然后再进行比较。


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初始化小数时,尽量用字符串形式,例如newBigDecimal("0.1");
BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小。
BigDecimal作除法时,除了要考虑除数是否为0,更要考虑是否能除尽的问题,直接调用BigDecimaldivide(BigDecimal divisor, int scale, int roundingMode)方法做除法可以避免除不尽的问题。
对于BigDecimal的大小比较,用equals方法的话会不仅会比较值的大小,还会比较两个对象的精确度,而compareTo方法则不会比较精确度,只比较数值的大小。

微信扫一扫

第七城市微信公众平台