BigDecimal的比较方法equals和compareTo

前两天又不小心踩了个坑,就是关于BigDecimal的大小比较。这个问题搜一下发现还是有不少人踩坑的,就记录一下吧。

一般来说都是用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怎么写的吧,其实如果我当初能好好看文档就不会出现这种问题了。
Snipaste_2020-03-22_15-22-09.jpg

根据compareTo的说明:如果两个BigDecimal值相等但是精度不同(如2.0和2.00),此方法认为两个值相等。
根据equals的说明:不同于compareTo方法,此方法比较两个BigDecimal仅当它们的值和精度都相同时才是相等的。

那么其实根据文档的说明一般来说只用compareTo就已经能够应对绝大部分需求了,用了equals反而不合适。
当值的精度和大小同样重要时就需要用到equals了,那么我也查了下equals的使用场景,比如存储两个传感器的测量数据,其中一个的精度是另一个的10倍,这种就需要将精度的比较也包含在内了。

标签: none

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……