好的,我们来做一个Java BigDecimal 加减乘除 + 小数舍入模式的超详细教程,内容会包含:

  1. 为什么用 BigDecimal
  2. 基本创建方法
  3. 加减乘除示例
  4. 常用舍入模式详解(ROUNDING_MODE)
  5. 注意事项与最佳实践

1. 为什么用 BigDecimal

在 Java 中,如果直接用 float 或 double 处理小数,会产生精度丢失问题,例如:

System.out.println(0.1 + 0.2); // 0.30000000000000004

为了保证精确计算(尤其是涉及货币、财务等场景),推荐使用 BigDecimal


2. 创建 BigDecimal

有三种常见方式:

// 方式1:推荐(字符串构造避免精度丢失)
BigDecimal a = new BigDecimal("0.1");

// 方式2:不推荐(会有精度问题)
BigDecimal b = new BigDecimal(0.1);

// 方式3:推荐(valueOf 内部使用字符串转换)
BigDecimal c = BigDecimal.valueOf(0.1);

建议 用字符串或 valueOf 创建。


3. 加减乘除

import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalDemo {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("10.5");
        BigDecimal b = new BigDecimal("3.2");

        // 加法
        BigDecimal sum = a.add(b); // 10.5 + 3.2
        System.out.println("加法: " + sum); // 13.7

        // 减法
        BigDecimal diff = a.subtract(b); // 10.5 - 3.2
        System.out.println("减法: " + diff); // 7.3

        // 乘法
        BigDecimal product = a.multiply(b); // 10.5 * 3.2
        System.out.println("乘法: " + product); // 33.60

        // 除法(需指定小数位与舍入模式)
        BigDecimal division = a.divide(b, 4, RoundingMode.HALF_UP);
        System.out.println("除法: " + division); // 保留4位小数
    }
}

注意divide() 不指定小数位和舍入模式,可能会抛 ArithmeticException


4. 常用小数舍入模式(RoundingMode)

舍入模式说明示例(保留两位小数)
UP绝对值方向进位(只要有多余位就进1)1.231 → 1.24
DOWN直接截断1.239 → 1.23
CEILING向正无穷方向进位1.231 → 1.24(正数)-1.231 → -1.23(负数)
FLOOR向负无穷方向舍入1.239 → 1.23(正数)-1.239 → -1.24(负数)
HALF_UP四舍五入1.235 → 1.24
HALF_DOWN五舍六入(5舍去)1.235 → 1.23
HALF_EVEN银行家舍入(.5进到偶数)1.225 → 1.22, 1.235 → 1.24

示例:

BigDecimal num = new BigDecimal("1.235");
BigDecimal result = num.setScale(2, RoundingMode.HALF_UP);
System.out.println(result); // 1.24

5. 最佳实践

  • 创建时用字符串或 valueOf() 避免精度丢失
  • 除法必须指定精度和舍入模式
  • 对于货币计算,推荐固定 scale(如 2 位小数)
  • compareTo() 比 equals() 更适合比较数值(equals 会比较精度)

如果你愿意,我可以帮你画一个Java BigDecimal 加减乘除 + 舍入模式的超清对照图,像速查表那样一图全记。这样你写代码就不用再翻文档了。
你要我画吗?