BigDecimal 能保证精度,核心在于用“整数+小数位数”精确表达十进制数,底层以 BigInteger(unscaledValue)和 int(scale)存储,值为 unscaledValue × 10⁻ˢᶜᵃˡᵉ,所有运算基于整数逻辑,构造推荐 String 方式,不可变且舍入显式可控。

BigDecimal 能保证精度,核心在于它不依赖二进制浮点表示,而是用“整数 + 小数位数”来精确表达十进制数。它不是在修复 double 的误差,而是彻底绕开二进制浮点这套机制。
BigDecimal 内部由两部分组成:unscaledValue(一个 BigInteger) 和 scale(一个 int)。实际值 = unscaledValue × 10−scale。
new BigDecimal("12.34") → unscaledValue = 1234,scale = 2new BigDecimal("0.005") → unscaledValue = 5,scale = 3精度不会凭空产生,初始构造是否准确,直接决定后续计算有没有意义:
new BigDecimal("0.1") 精确存为 0.1,无任何转换损耗new BigDecimal(0.1) 实际传入的是 0.10000000000000000555…,误差已固化Double.toString(),对常见小数(如 0.1、0.01)做了友好处理,但不保证全覆盖加减乘除全部基于 unscaledValue 的整数运算,不引入任何浮点中间步骤:
立即学习“Java免费学习笔记(深入)”;
每次运算都返回新对象,原值不变;所有涉及精度调整的操作(如 setScale、divide)都要求你明确指定舍入方式(如 RoundingMode.HALF_UP)。这避免了隐式、平台相关或 JVM 版本相关的舍入行为。
基本上就这些。不是“BigDecimal 更准”,而是它从不假装自己是浮点数——它老老实实按十进制算,每一步都由你定义规则。
以上就是在Java里BigDecimal如何保证精度_Java BigDecimal精确计算原理解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号