BigDecimal应使用字符串构造避免精度误差,运算返回新实例,除法需指定精度和舍入模式(如HALF_UP),比较应使用compareTo而非equals。
在Java中,BigDecimal 是处理高精度数学运算的常用类,特别适用于金融计算、科学计算等对精度要求高的场景。它能避免 float 和 double 运算中的精度丢失问题。
1. 创建 BigDecimal 对象
建议使用字符串构造函数创建,避免使用 double 构造函数导致精度问题。
- BigDecimal a = new BigDecimal("0.1"); // 正确
- BigDecimal b = new BigDecimal(0.1); // 不推荐,可能引入精度误差
2. 基本数学运算方法
BigDecimal 是不可变对象,所有运算都会返回新的实例。
- 加法(add):a.add(b)
- 减法(subtract):a.subtract(b)
- 乘法(multiply):a.multiply(b)
- 除法(divide):需注意除不尽的情况,必须指定精度和舍入模式
3. 舍入模式(RoundingMode)
在进行除法或设置精度时,必须指定舍入方式:
- RoundingMode.HALF_UP:四舍五入(最常用)
- RoundingMode.DOWN:向零方向舍入
- RoundingMode.UP:远离零方向进位
- RoundingMode.FLOOR:向下取整
- RoundingMode.CEILING:向上取整
4. 比较与等值判断
使用 compareTo() 判断数值大小,equals() 还会比较精度(scale),不推荐用于值比较。
BigDecimal x = new BigDecimal("1.0"); BigDecimal y = new BigDecimal("1.00"); x.equals(y); // false,因为 scale 不同 x.compareTo(y) == 0; // true,数值相等 基本上就这些,用好构造方式、掌握 divide 的参数要求、注意比较方式,就能正确使用 BigDecimal 完成精确计算。








