好的,我给你整理一份 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️⃣ 注意事项

  1. 避免使用 double 构造new BigDecimal(0.1) → 0.10000000000000000555 推荐:new BigDecimal("0.1") 或 BigDecimal.valueOf(0.1)
  2. 比较大小不要用 equals()new BigDecimal("1.0").equals(new BigDecimal("1")) // false new BigDecimal("1.0").compareTo(new BigDecimal("1")) == 0 // true
  3. 除法需指定精度和舍入模式,否则可能抛异常:BigDecimal a = new BigDecimal("1"); BigDecimal b = new BigDecimal("3"); a.divide(b); // 会报 ArithmeticException
  4. 适合高精度运算,不适合性能要求极高的场景