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

 

五、异常处理要点

  1. ArithmeticException

    • 未指定舍入模式时除不尽的情况

    • 除数为零的情况

  2. 推荐处理方式

try {
    return num1.divide(num2, RoundingMode.HALF_UP);
} catch (ArithmeticException e) {
    // 处理除数为零或无法表示精确结果的情况
}

 

六、最佳实践建议

  1. 金融计算必须使用BigDecimal

  2. 涉及除法运算时始终显式指定舍入模式

  3. 优先使用String构造器初始化数值

  4. 比较数值时使用compareTo()而非equals()

  5. 复杂运算考虑使用NumberFormat进行格式化输出

posted @ 2025-02-07 09:40  三苇渡江  阅读(250)  评论(0)    收藏  举报