java浮点数计算不准确的根本原因是ieee 754二进制表示无法精确存储多数十进制小数,如0.1+0.2≠0.3;应使用bigdecimal("0.1")而非new bigdecimal(0.1),运算时指定精度与舍入模式,比较用compareto()而非equals()。

Java 中浮点数计算不准确,根本原因是 float 和 double 基于二进制 IEEE 754 标准表示小数,而很多十进制小数(如 0.1、0.3)无法被精确表示为有限位二进制小数,导致存储和运算时产生微小误差。例如 0.1 + 0.2 == 0.3 返回 false。
用 BigDecimal 构造时避免 double 入参
这是最常见也最容易踩的坑:直接用 double 值构造 BigDecimal,误差会“继承”进来。
❌ 错误写法(仍带精度问题):
BigDecimal a = new BigDecimal(0.1); // 实际传入的是 0.10000000000000000555...
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
✅ 正确写法(用字符串构造):
- 始终使用
String构造:new BigDecimal("0.1") - 或用静态方法
BigDecimal.valueOf(double)(它内部转成了字符串再构造,相对安全)
运算时指定精度和舍入模式
BigDecimal 默认不自动缩放,加减乘除结果可能位数很长;除法还必须指定精度和舍入方式,否则抛 ArithmeticException。
- 加减法建议调用
add()/subtract(),它们保留高精度,但要注意 scale(小数位数)对齐规则 - 乘法用
multiply(),结果 scale 是两操作数 scale 之和;如需控制,后续调用setScale(scale, RoundingMode) - 除法必须用
divide(divisor, scale, roundingMode),例如:bd1.divide(bd2, 2, RoundingMode.HALF_UP)
比较大小别用 == 或 equals()
BigDecimal 的 equals() 方法会同时比较值和 scale(比如 new BigDecimal("1.0") 和 new BigDecimal("1.00") 不相等),这常导致意外结果。
- 判断数值是否相等,用
compareTo():返回 0 表示相等 - 例如:
bd1.compareTo(bd2) == 0 - 需要严格语义相等(值+精度都一致)才用
equals()
实际使用的小建议
- 输入数据尽量早转成
BigDecimal(如从字符串、整数或用户输入解析后立即构建) - 避免在中间步骤混用
double运算,防止污染精度 - 数据库字段对应
DECIMAL类型时,JDBC 驱动通常能正确映射为BigDecimal,保持一致性 - 日志或展示前可调用
stripTrailingZeros().toPlainString()得到简洁字符串(如"1.00"→"1")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










