BigDecimal的比较方法equals和compareTo
前两天又不小心踩了个坑,就是关于BigDecimal的大小比较。这个问题搜一下发现还是有不少人踩坑的,就记录一下吧。
- https://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#compareTo%28java.lang.Object%29 JavaDoc
- https://stackoverflow.com/questions/6787142/bigdecimal-equals-versus-compareto
- https://juejin.im/post/5d5a3882f265da03d60effb0
- https://stackoverflow.com/questions/14102083/why-is-bigdecimal-equals-specified-to-compare-both-value-and-scale-individually
一般来说都是用compareTo这个方法,也没有去关注过BigDecimal的equals。一次写代码时需要判断一个BigDecimal是否等于0,一般来说直接compateTo判断是否==0就行了,当时不知怎么脑子抽了一下,写了个equals,自己写完随手测的时候发现没问题就直接提交了。然后就悲剧了,出了问题找半天发现这个坑。
先来看段代码猜猜结果:
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
BigDecimal decimal1 = new BigDecimal("222.00");
BigDecimal decimal2 = new BigDecimal("222.000000");
System.out.println(decimal1.equals(decimal2));
System.out.println(decimal1.compareTo(decimal2) == 0);
System.out.println("===================");
BigDecimal decimal3 = BigDecimal.ZERO;
BigDecimal decimal4 = new BigDecimal("0.00");
System.out.println(decimal3.equals(decimal4));
System.out.println(decimal3.compareTo(decimal4) == 0);
}
}
运行结果是:
false
true
===================
false
true
猜对了没?来看下JavaDoc怎么写的吧,其实如果我当初能好好看文档就不会出现这种问题了。
根据compareTo的说明:如果两个BigDecimal值相等但是精度不同(如2.0和2.00),此方法认为两个值相等。
根据equals的说明:不同于compareTo方法,此方法比较两个BigDecimal仅当它们的值和精度都相同时才是相等的。
那么其实根据文档的说明一般来说只用compareTo就已经能够应对绝大部分需求了,用了equals反而不合适。
当值的精度和大小同样重要时就需要用到equals了,那么我也查了下equals的使用场景,比如存储两个传感器的测量数据,其中一个的精度是另一个的10倍,这种就需要将精度的比较也包含在内了。