继续谈谈 BigDecimal(某里禁止使用BigDecimal的equals方法做等值比较)

昨天 Bug 学习:一分钱的误差 提到了BigDecimal,正好今天看到这篇文章 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?,再多谈一点。

众所周知,在支付、电商、金融等业务的金额表示、计算等场景,不能使用 double、float 等类型,而是要使用对精度支持更好的 BigDecimal。

它自带了加,减,乘,除等运算方法和等值判断等。

最新版的《阿里巴巴Java开发手册》:10. 【强制】如上所示 BigDecimal 的等值比较应使用 compareTo() 方法,而不是 equals() 方法。说明:equals() 方法会比较值和精度(1.0 与 1.00 返回结果为 false),而 compareTo() 则会忽略精度。

做下实验:

1
2
3
BigDecimal bigDecimal1 = new BigDecimal("1");
BigDecimal bigDecimal2 = new BigDecimal("1.0");
System.out.println(bigDecimal1.equals(bigDecimal2)); // false,精度不同

BigDecimal的JavaDoc:Compares this BigDecimal with the specified Object for equality. Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by this method) 和 compareTo 不同,equals方法会比较两部分内容,分别是值(value)和精度(scale)。

这在实际业务场景中经常是不符合需要的。所以推荐使用忽略精度的compareTo方法。