Java BigDecimal 计算,加减乘除,大小比较
一、对象创建规范
推荐使用字符串构造器初始化:
BigDecimal num1 = new BigDecimal("123.4567"); // ✅ 推荐 BigDecimal num2 = new BigDecimal(123.456); // ⚠️ 谨慎使用(存在精度风险)
二、精确比较运算
1. 值比较方法
int result = num1.compareTo(num2); // 返回结果: // 1 → num1 > num2 // 0 → num1 == num2 // -1 → num1 < num2
2. 等值判断注意事项
避免使用equals()方法:
new BigDecimal("1.0").equals(new BigDecimal("1")) // false(精度不同) new BigDecimal("1.0").compareTo(new BigDecimal("1")) == 0 // true
三、算术运算规范
1. 基础四则运算
// 加法(保留原始精度) BigDecimal sum = num1.add(num2); // 减法(自动处理负值) BigDecimal difference = num1.subtract(num2); // 乘法(精度自动扩展) BigDecimal product = num1.multiply(num2); // 安全除法(必须指定舍入模式) BigDecimal quotient = num1.divide(num2, 20, RoundingMode.HALF_UP);
2. 除法运算扩展模式
// 常用舍入策略: divide(divisor, scale, RoundingMode.HALF_UP) // 四舍五入 divide(divisor, scale, RoundingMode.UP) // 远离零方向舍入 divide(divisor, scale, RoundingMode.DOWN) // 趋近零方向舍入 divide(divisor, scale, RoundingMode.CEILING) // 向正无穷舍入 divide(divisor, scale, RoundingMode.FLOOR) // 向负无穷舍入
四、精度控制策略
1. 全局精度设置
BigDecimal result = num1.divide(num2, new MathContext(10, RoundingMode.HALF_UP)); // 总有效位数10位
2. 小数位格式化
// 保留两位小数(货币格式化) BigDecimal money = new BigDecimal("123.4567"); money = money.setScale(2, RoundingMode.HALF_EVEN); // → 123.46
五、异常处理要点
-
ArithmeticException:
-
未指定舍入模式时除不尽的情况
-
除数为零的情况
-
-
推荐处理方式:
try { return num1.divide(num2, RoundingMode.HALF_UP); } catch (ArithmeticException e) { // 处理除数为零或无法表示精确结果的情况 }
六、最佳实践建议
-
金融计算必须使用BigDecimal
-
涉及除法运算时始终显式指定舍入模式
-
优先使用String构造器初始化数值
-
比较数值时使用compareTo()而非equals()
-
复杂运算考虑使用NumberFormat进行格式化输出
浙公网安备 33010602011771号