最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java中 BigDecimal add 方法 如何实现高精度加法计算
时间:2026-07-21 09:21:56 编辑:袖梨 来源:一聚教程网
Java中BigDecimal.add()是高精度加法标准方式,需用字符串构造避免二进制误差,add()天然不丢精度且结果scale取操作数较大值,批量累加应避免频繁setScale和double构造,推荐直接字符串构造+循环add+最终格式化。
Java 中 BigDecimal.add() 是做高精度加法的标准方式,核心在于“用对构造、用对方法、不丢精度、不增开销”。
构造 BigDecimal 要用字符串
避免浮点数二进制误差是精度前提:
- ✅ 正确:
new BigDecimal("123.456")、new BigDecimal("0.1") - ❌ 错误:
new BigDecimal(0.1)(实际值是0.10000000000000000555...) - ⚠️ 注意:
BigDecimal.valueOf(double)内部调用Double.toString(),虽比直接构造稍安全,但仍可能隐含误差;金融/计费等关键场景一律优先选字符串构造
add() 方法本身不设精度,结果保留完整精度
加法天然不会丢失精度,add() 返回的结果小数位数取两个操作数中较大的 scale 值:
-
new BigDecimal("1.23").add(new BigDecimal("4.5"))→"5.73"(scale = max(2,1) = 2) - 无需像除法那样强制指定 scale 或抛异常,但若需统一输出格式(如金额保留两位小数),后续再用
setScale(2, RoundingMode.HALF_UP) - 不要在每次
add()时都调用setScale(),否则会叠加舍入误差;统一在最终结果上做格式化
批量累加要控制临时对象开销
因为 BigDecimal 不可变,循环中 sum = sum.add(x) 每次都生成新对象。万级数据以上易触发 GC 压力:
立即学习“Java免费学习笔记(深入)”;
- 基础写法(推荐):
BigDecimal sum = BigDecimal.ZERO; for (var x : list) sum = sum.add(x);—— 简单清晰,引用复用,旧对象交由 GC - 大集合分批合并:每 100~500 个一组先局部累加,再合并批次结果,减少中间对象数量
- 如需统一舍入规则(如所有加法按 DECIMAL128 处理),预定义
MathContext mc = new MathContext(34, RoundingMode.HALF_UP),用sum.add(x, mc)替代默认版本
别踩这些常见坑
看似优化,实则引入风险或无效:
- 用
double构造再加 —— 从源头污染精度,后面怎么加都白搭 - 在循环里反复
setScale()再加 —— 多次舍入导致累计偏差 - 试图缓存中间计算结果(如
new BigDecimal("123.45"))—— 除非业务中存在大量完全相同的常量值,否则缓存收益远低于维护成本 - 混淆
scale和precision:加法只影响 scale(小数位数),不影响有效数字位数;精度控制应通过MathContext或最终setScale()统一处理
相关文章
- 试玩体验《梦幻地下城:放置好时光》挂机摸鱼神器 07-28
- 三国天下归心双动召唤阵地队阵容推荐 双动召唤阵地队搭配攻略 07-28
- 遗忘之海宝箱位置推荐 遗忘之海宝箱位置在哪里 07-28
- 核纪元枪械改装五大配件部位效果一览 07-28
- 《梦幻地下城:放置好时光》挂机打书培养满红宠物 07-28
- 以撒的结合控制台打开方法-控制台详细开启步骤 07-28