好的,我给你整理一份 Java 中 BigDecimal 的详解,涵盖基础概念、常用操作、注意事项和实战技巧。
1️⃣ BigDecimal 简介
BigDecimal
是 Java 提供的用于高精度计算的类,尤其适合:
- 金融计算
- 需要精确小数运算的场景
- 避免浮点数
float
/double
精度丢失
特点:
- 精确表示任意大小的浮点数
- 支持精确加减乘除和取余
- 可自定义精度和舍入模式
引用包:
import java.math.BigDecimal;
import java.math.RoundingMode;
2️⃣ BigDecimal 创建方式
BigDecimal bd1 = new BigDecimal("123.456"); // 推荐:使用字符串构造,避免精度丢失
BigDecimal bd2 = BigDecimal.valueOf(123.456); // 推荐
BigDecimal bd3 = new BigDecimal(123.456); // 不推荐:double 转换可能精度丢失
BigDecimal bd4 = new BigDecimal(10); // 整数
✅ 总结:构造 BigDecimal 最安全的方式是使用 String 或 valueOf(double)。
3️⃣ 常用运算方法
运算 | 方法 | 示例 |
---|---|---|
加法 | add(BigDecimal) | bd1.add(bd2) |
减法 | subtract(BigDecimal) | bd1.subtract(bd2) |
乘法 | multiply(BigDecimal) | bd1.multiply(bd2) |
除法 | divide(BigDecimal) | bd1.divide(bd2) (需注意精度) |
除法带舍入 | divide(BigDecimal, scale, RoundingMode) | bd1.divide(bd2, 2, RoundingMode.HALF_UP) |
取余 | remainder(BigDecimal) | bd1.remainder(bd2) |
比较大小 | compareTo(BigDecimal) | bd1.compareTo(bd2) 0=相等, 1=大, -1=小 |
设置小数位 | setScale(int scale, RoundingMode) | bd1.setScale(2, RoundingMode.HALF_UP) |
4️⃣ 舍入模式(RoundingMode)
模式 | 描述 |
---|---|
UP | 向远离零方向舍入 |
DOWN | 向零方向舍入(截断) |
CEILING | 向正无穷方向舍入 |
FLOOR | 向负无穷方向舍入 |
HALF_UP | 四舍五入(最常用) |
HALF_DOWN | 五舍六入 |
HALF_EVEN | 银行家舍入法 |
5️⃣ BigDecimal 示例
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("10.1234");
BigDecimal b = new BigDecimal("3.21");
// 加法
System.out.println("a + b = " + a.add(b));
// 减法
System.out.println("a - b = " + a.subtract(b));
// 乘法
System.out.println("a * b = " + a.multiply(b));
// 除法,保留2位小数,四舍五入
System.out.println("a / b = " + a.divide(b, 2, RoundingMode.HALF_UP));
// 设置小数位
System.out.println("a setScale 3 = " + a.setScale(3, RoundingMode.HALF_UP));
// 比较
System.out.println("a > b? " + (a.compareTo(b) > 0));
}
}
输出示例:
a + b = 13.3334
a - b = 6.9134
a * b = 32.526114
a / b = 3.16
a setScale 3 = 10.123
a > b? true
6️⃣ 注意事项
- 避免使用 double 构造
new BigDecimal(0.1) → 0.10000000000000000555
推荐:new BigDecimal("0.1")
或BigDecimal.valueOf(0.1)
- 比较大小不要用 equals()
new BigDecimal("1.0").equals(new BigDecimal("1")) // false new BigDecimal("1.0").compareTo(new BigDecimal("1")) == 0 // true
- 除法需指定精度和舍入模式,否则可能抛异常:
BigDecimal a = new BigDecimal("1"); BigDecimal b = new BigDecimal("3"); a.divide(b); // 会报 ArithmeticException
- 适合高精度运算,不适合性能要求极高的场景
发表回复