BigDecimal比较大小
BigDecimal
BigDecimal,是一种java.math包中提供的一种可以用来进行精确运算的类型,在进行金额表示、金额计算等场景,不能使用double、float等类型,而是要使用对精度支持的更好的BigDecimal。
所以,很多支付、电商、金融等业务中,BigDecimal的使用非常频繁,其内部自带了很多方法,如加,减,乘,除等运算方法都是可以直接调用的,代码中还经常需要对于数字进行相等判断。
BigDecimal比较
==比较
BigDecimal bigDecimal = new BigDecimal(1); BigDecimal bigDecimal1 = new BigDecimal(1); System.out.println(bigDecimal == bigDecimal1); //false
有人会犯这种低级错误,用==直接比较肯定是无法得到自己想要的情况的,因为BigDecimal是对象,所以是无法用==来比较两个数字的值是否相等。
== 可以用来比较基本类型的数值,例如:
int a = 1; int b = 1; System.out.println(a==b); //true
== 用来比较对象,比较的是引用对象的引用地址,例如:
BigDecimal bigDecimal = new BigDecimal(1); BigDecimal bigDecimal1 = new BigDecimal(1); System.out.println(bigDecimal == bigDecimal1); //false
由于对象的引用地址不一样,所以返回false。
equals 比较
BigDecimal bigDecimal = new BigDecimal(1); BigDecimal bigDecimal1 = new BigDecimal(1); System.out.println(bigDecimal.equals(bigDecimal1)); //true BigDecimal bigDecimal2 = new BigDecimal(1); BigDecimal bigDecimal3 = new BigDecimal(1.0); System.out.println(bigDecimal2.equals(bigDecimal3)); //true BigDecimal bigDecimal4 = new BigDecimal("1"); BigDecimal bigDecimal5 = new BigDecimal("1.0"); System.out.println(bigDecimal4.equals(bigDecimal5)); //false
通过结果可以看出BigDecimal在进行equals比较时,有的时候是true(当使用int、double定义BigDecimal时),有的时候是false(当使用String定义BigDecimal时)。
在BigDecimal的JavaDoc注释中提到,equals和compareTo比较不太一样,equals比较时会比较value and scale,所以再来看上面bigDecimal4和bigDecimal5的结果就明白了
那么为什么用int 、double定义BigDecimal时就一样呢
- 用int时debug结果图
其中scale和xDec.scale的值都是0 - 用double时debug结果图
其中scale和xDec.scale的值都是0 - 用string时debug结果图
其中bigDecimal4的scale是0,而bigDecimal5的scale是1,这样比较的结果就是false了。
前面,我们解释了BigDecimal的equals方法,其实不只是会比较数字的值,还会对其标度进行比较。
所以,当我们使用equals方法判断判断两个数是否相等的时候,是极其严格的。
compareTo比较
针对上面equals比较比较严格的情况,如果只想比较值呢,BigDecimal为我们提供了compareTo方法。
BigDecimal bigDecimal4 = new BigDecimal("1"); BigDecimal bigDecimal5 = new BigDecimal("1.0"); System.out.println(bigDecimal4.equals(bigDecimal5)); //false BigDecimal bigDecimal6 = new BigDecimal("1"); BigDecimal bigDecimal7 = new BigDecimal("1.0"); System.out.println(bigDecimal6.compareTo(bigDecimal7)); //0
此时我们看到bigDecimal6和bigDecimal7比较的值为0,即相等。
我们可以看到BigDecimal中compareTo的JavaDoc注释,compareTo只比较值,其中返回结果:-1表示小于,0表示等于,1表示大于
一般BigDecimal值的比较用compareTo就好,用equals比较的话可能会得到不是你想要的结果而自己又不曾意识到。