Java中BigDecimal.equals()返回false的原因及正确用法
Java中BigDecimal.equals()的正确使用方法
先看你写的代码:
import java.math.BigDecimal; public class test { public static void main(String[] args) { BigDecimal b1 = new BigDecimal("0.1"); BigDecimal b2 = new BigDecimal("0.2"); System.out.println(b1.multiply(b2)); // 输出0.02 System.out.println(b1.multiply(b2).equals("0.02")); // 返回false System.out.println(b1.add(b2)); // 输出0.3 System.out.println(b1.add(b2).equals("0.3")); // 返回false } }
问题原因
你遇到的false结果,核心有两个原因:
- 类型不匹配:你调用
equals()时传入的是String对象,而BigDecimal的equals()方法首先会判断传入对象是否为BigDecimal类型,不是则直接返回false。 - 精度(scale)的影响:就算传入的是BigDecimal对象,
equals()也会同时比较数值和精度。比如new BigDecimal("0.02")和new BigDecimal("0.020"),数值相同但精度不同,equals()会返回false。
正确用法
1. 比较数值+精度完全一致
确保比较的是两个BigDecimal对象,此时equals()会同时校验数值和精度:
// 正确写法:把字符串转成BigDecimal再比较 System.out.println(b1.multiply(b2).equals(new BigDecimal("0.02"))); // 返回true
2. 仅比较数值是否相等
如果不需要关注精度差异,用compareTo()方法,返回0表示数值相等:
// 仅比较数值,忽略精度 System.out.println(b1.multiply(b2).compareTo(new BigDecimal("0.02")) == 0); // 返回true System.out.println(b1.add(b2).compareTo(new BigDecimal("0.3")) == 0); // 返回true
总结
- 永远不要用BigDecimal对象直接和String对象调用
equals(),类型不匹配必然返回false。 - 需同时校验数值和精度时用
equals(),仅需校验数值时用compareTo()。
内容的提问来源于stack exchange,提问作者Ian Lin
相关产品推荐
相关产品推荐

