BigDecimal精度与相等比较的坑

 先想一下,创建BigDecimal对象的时候一般是怎么创建的?

  • new一个,传进去值
  • BigDecimal.valueOf方法,传进去值

 

作为一个数字类型,经常有的操作是比较大小,有一种情况是比较是否相等。用equal方法还是compareTo方法?这里就是一个大坑

复制代码
 1 //new 传进去一个double 2 BigDecimal newZero = new BigDecimal(0.0);  3 System.out.println(BigDecimal.ZERO.equals(newZero));  4   5 //new 传进去一个字符串 6 BigDecimal stringNewZero = new BigDecimal("0.0");  7 System.out.println(BigDecimal.ZERO.equals(stringNewZero));  8   9 //valueOf  传进去一个double10 BigDecimal noScaleZero = BigDecimal.valueOf(0.0); 11 System.out.println(BigDecimal.ZERO.equals(noScaleZero)); 12  13 //valueOf  传进去一个double,再手动设置精度为114 BigDecimal scaleZero = BigDecimal.valueOf(0.0).setScale(1); 15 System.out.println(BigDecimal.ZERO.equals(scaleZero));
复制代码

 

用于比较的值全都是0,猜一猜上面几个equals方法返回的结果是什么?全都是true?no no no...

复制代码
truefalsefalsefalse
复制代码

 

惊不惊喜,意不意外?原因是什么呢?看一下BigDecimal的equals方法的实现:

复制代码
 1 public boolean equals(Object x) {  2     //类型不同,直接返回false 3     if (!(x instanceof BigDecimal))  4         return false;  5     BigDecimal xDec = (BigDecimal) x;  6     //同一个对象,直接返回true 7     if (x == this) 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信