BigDecimal需用字符串构造以避免精度误差,运算须调用add、subtract等方法并显式设置精度与舍入模式,比较大小应使用compareTo而非equals或==。

BigDecimal 是 Java 中用于高精度浮点数运算的核心类,它避免了 float 和 double 的二进制表示误差,适合金融计算、科学计算等对精度要求严格的场景。关键在于:**必须用字符串构造,运算用方法调用,结果需显式设置精度和舍入模式。**
构造 BigDecimal 要用字符串,别用 double
直接用 double 构造会继承其精度缺陷,导致“假精度”:
BigDecimal a = new BigDecimal(0.1); // 实际值是 0.10000000000000000555...
BigDecimal a = new BigDecimal("0.1"); // 精确表示十进制 0.1
立即学习“Java免费学习笔记(深入)”;
其他安全方式还包括:BigDecimal.valueOf(double)(内部转字符串),但最稳妥仍是字符串字面量。
四则运算必须调用方法,不能用 + - * /
BigDecimal 是不可变对象,所有运算都返回新实例,且需指定舍入规则(尤其除法):
-
a.add(b)—— 加法,无精度损失 -
a.subtract(b)—— 减法 -
a.multiply(b)—— 乘法,结果精度为两操作数精度之和 -
a.divide(b, scale, RoundingMode.HALF_UP)—— 除法必须指定小数位数(scale)和舍入模式
例如:new BigDecimal("10").divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP) 得到 3.33。
比较大小别用 == 或 equals(),要用 compareTo()
== 比较引用,equals() 同时比较值和标度(scale),1.0 和 1.00 的 equals() 返回 false:
-
a.compareTo(b) > 0→ a 大于 b -
a.compareTo(b) == 0→ a 等于 b(忽略标度差异) a.compareTo(b) → a 小于 b
这是判断数值相等性的唯一可靠方式。
控制精度和舍入要主动设置,不依赖默认
除法、setScale() 等操作必须明确指定小数位数与舍入策略,常用模式有:
-
RoundingMode.HALF_UP:四舍五入(日常计费常用) -
RoundingMode.HALF_EVEN:银行家舍入(减少统计偏差) -
RoundingMode.DOWN:直接截断(如手续费取整)
例如保留两位小数:amount.setScale(2, RoundingMode.HALF_UP)。


















