You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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结果,核心有两个原因:

  1. 类型不匹配:你调用equals()时传入的是String对象,而BigDecimal的equals()方法首先会判断传入对象是否为BigDecimal类型,不是则直接返回false。
  2. 精度(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:20:29