请不要使用BigDecimal的equals()方法

75 阅读1分钟

文章背景

过去的开发中比较两个对象是否相等习惯性的一直在使用equals方法,昨天做一个支付系统退款功能的开发时,全额退款和部分退款调用的是不同的逻辑,所以需要判断退款金额和支付总金额是否相同,于是我想到的就是使用BigDecimal的equals去比较两个金额是否相同,破天荒的发现这个比较有问题

数据库中保存的是有两位小数的数值2899.00,入参传过来要退款的金额是2899,于是就有了下面的代码

if (payAmount().equals(refundAmount())) {
}

发现 if 代码块未执行

解决方案

使用BigDecimal的compareTo方法,如果返回的为0则代表值相同

if (payAmount().compareTo(refundAmount()) != 0) {
}

问题原因

看jdk源码发现了问题出在哪里

image.png

image.png