java中bigdecimal高精度计算的核心是避免double构造、统一用字符串初始化、显式指定scale和roundingmode;它消除二进制浮点误差,适用于金融等确定性要求高的场景。

Java 中用 BigDecimal 处理高精度浮点数,核心是**避免使用 double/float 构造器、始终指定精度模式、统一用字符串构造数值**。它不解决“所有精度问题”,但能消除二进制浮点数的表示误差,适用于金融、科学计算等对结果确定性要求高的场景。
为什么不能直接用 double 构造 BigDecimal
double 本身存在二进制精度丢失,用它构造 BigDecimal 只是把一个“已经不准的值”包装成 BigDecimal,错误被固化下来:
-
new BigDecimal(0.1)实际得到的是0.1000000000000000055511151231257827021181583404541015625 - 正确做法是:
new BigDecimal("0.1")—— 字符串直接解析,无中间浮点转换
四则运算必须用方法调用,不能用 + - * /
BigDecimal 是不可变对象,没有重载运算符。所有计算都通过方法完成,且需显式指定舍入规则(否则除法可能抛 ArithmeticException):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 加法:
a.add(b) - 减法:
a.subtract(b) - 乘法:
a.multiply(b)(结果精度 = a.scale + b.scale) - 除法:
a.divide(b, scale, RoundingMode.HALF_UP)—— 必须指定小数位数和舍入方式
控制精度和舍入:scale 和 RoundingMode 是关键
scale 表示小数点后位数;RoundingMode 决定如何处理溢出位。常见组合:
- 货币计算(两位小数):
result.setScale(2, RoundingMode.HALF_EVEN)(银行家舍入,更公平) - 普通四舍五入:
RoundingMode.HALF_UP - 避免异常:除法务必设 scale,如
money.divide(rate, 6, RoundingMode.HALF_UP)
比较大小不能用 == 或 compareTo() 要小心
== 比较引用,永远为 false;compareTo() 返回 -1/0/1,适合排序或条件判断;equals() 还会比较 scale(new BigDecimal("1.0").equals(new BigDecimal("1")) 是 false),所以判等推荐用 compareTo() == 0:
- 正确判相等:
a.compareTo(b) == 0 - 安全比较大小:
a.compareTo(b) > 0表示 a > b - 避免:
a.equals(b)(除非你明确需要 scale 也一致)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










