1. 常用四大方法
- 加 add
- 减 subtract
- 乘 multiply
- 除 divide
2. 比较使用 compareTo
- 不能使用 == (都知道)
- equals 写惯了,冷不丁一写就忘,内部重写了 会比较两个数的精度长度是否相等 (2与 2.00 不等)
- A.compareTo(B)
- == 0 相等
-
0 理解为 A- B > 0 A > B
- < 0 理解为 A- B < 0 A < B
3. 除法精度问题
- 使用 A.divide(B) 时强烈建议,跟随保留小数问题
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
BigDecimal result = a.divide(b); // ❌
- 异常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
- 尽可能使用:
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP);
4. BigDecimal 初始化建议
- BigDecimal初始化使用 String 类型 或者 BigDecimal.valueOf(),避免精度误差
BigDecimal a = new BigDecimal(0.1);
System.out.println(a); // 输出:0.1000000000000000055511151231257827021181583404541015625
5. BigDecimal 是不可变对象
- 参数传递时行为看起来像是值传递,一旦创建就不能更改原值,所有运算返回新对象
public void change(BigDecimal num) {
num = num.add(new BigDecimal("1"));
}
public void test() {
BigDecimal a = new BigDecimal("10");
change(a);
System.out.println(a); // 输出还是 10,没有改变
}
6. 保留小数问题
BigDecimal amount = new BigDecimal("123.456");
amount = amount.setScale(2, RoundingMode.HALF_UP); // 保留两位小数
- 注意:在转换为 json 时末尾是 .00 会丢失 只保留末尾非 0 部分,建议转换为 String
转 json 方法:
-
@JsonSerialize(using = ToStringSerializer.class) private BigDecimal amount;
-
public String getAmountStr() { return amount.setScale(2, RoundingMode.HALF_UP).toPlainString(); }