金额计算中 BigDecimal 的几个细节

举报
yd_214041702 发表于 2026/10/22 11:10:17 2026/10/22
【摘要】 金额计算中 BigDecimal 的几个细节Java 中处理金额时,使用 double 容易遇到精度问题。例如,0.1 + 0.2 的结果并不总是恰好等于 0.3。这是因为浮点数采用二进制表示,部分十进制小数无法被精确存储。创建 BigDecimal 时,尽量从字符串构造,不要直接传入 double:BigDecimal price = new BigDecimal("19.90");Bi...

金额计算中 BigDecimal 的几个细节

Java 中处理金额时,使用 double 容易遇到精度问题。例如,0.1 + 0.2 的结果并不总是恰好等于 0.3。这是因为浮点数采用二进制表示,部分十进制小数无法被精确存储。

创建 BigDecimal 时,尽量从字符串构造,不要直接传入 double:

BigDecimal price = new BigDecimal("19.90");
BigDecimal quantity = new BigDecimal("3");
BigDecimal total = price.multiply(quantity);

如果数据来自数据库或接口,可以先确认其边界类型,再统一转换。不要先转成 double,之后再包装成 BigDecimal,否则原有误差也会被带进去。

除法是另一个容易忽略的地方。像 1 ÷ 3 这样的结果无法有限表示,直接调用 divide 会抛出 ArithmeticException。通常应明确指定小数位数和舍入方式:

BigDecimal average = total.divide(
    quantity,
    2,
    RoundingMode.HALF_UP
);

比较数值时也要注意:BigDecimal.equals 会同时比较数值和小数位,因此 2.0 与 2.00 不相等;compareTo 则只比较数值大小。判断金额是否相等时,通常更适合使用:

amountA.compareTo(amountB) == 0

金额运算的关键不只是选用 BigDecimal,还包括统一转换方式、明确精度规则,并在需要舍入的位置显式处理。这样能减少不同业务环节对同一金额产生不同结果的情况。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。