金额计算中 BigDecimal 的几个细节
【摘要】 金额计算中 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)