一、算术运算

1.1、加法:add()

用于两个 BigDecimal 值的相加操作。

BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("20");
BigDecimal sum = a.add(b); // 结果为 30

1.2、减法:subtract()

用于两个 BigDecimal 值的相减操作。

BigDecimal c = new BigDecimal("50");
BigDecimal d = new BigDecimal("30");
BigDecimal difference = c.subtract(d); // 结果为 20

1.3、乘法:multiply()

用于两个 BigDecimal 值的相乘操作。

BigDecimal e = new BigDecimal("5");
BigDecimal f = new BigDecimal("6");
BigDecimal product = e.multiply(f); // 结果为 30

1.4、除法:divide()

用于两个 BigDecimal 值的相除操作,需指定舍入模式。

BigDecimal g = new BigDecimal("10");
BigDecimal h = new BigDecimal("3");
BigDecimal quotient = g.divide(h, 2, BigDecimal.ROUND_HALF_UP); // 结果为 3.33

1.5、绝对值:abs()

获取 BigDecimal 值的绝对值。

BigDecimal i = new BigDecimal("-15.5");
BigDecimal absoluteValue = i.abs(); // 结果为 15.5

二、四舍五入(setScale() 方法的舍入模式)

2.1、ROUND_DOWN(截断)

直接舍弃多余位数,不进位。

BigDecimal value1 = new BigDecimal("3.222452").setScale(2, BigDecimal.ROUND_DOWN);
System.out.println(value1); // 输出:3.22
​
BigDecimal value2 = new BigDecimal("-3.222452").setScale(2, BigDecimal.ROUND_DOWN);
System.out.println(value2); // 输出:-3.22

2.2、ROUND_UP(进位)

无论正负,只要舍弃部分不为零,均进位。

BigDecimal value3 = new BigDecimal("3.236452").setScale(2, BigDecimal.ROUND_UP);
System.out.println(value3); // 输出:3.24
​
BigDecimal value4 = new BigDecimal("-3.226452").setScale(2, BigDecimal.ROUND_UP);
System.out.println(value4); // 输出:-3.23

2.3、ROUND_CEILING(朝正无穷方向舍入)

  • 正数:等同于 ROUND_UP

  • 负数:等同于 ROUND_DOWN

BigDecimal value5 = new BigDecimal("3.236452").setScale(2, BigDecimal.ROUND_CEILING);
System.out.println(value5); // 输出:3.24
​
BigDecimal value6 = new BigDecimal("-3.226452").setScale(2, BigDecimal.ROUND_CEILING);
System.out.println(value6); // 输出:-3.22

2.4、ROUND_FLOOR(朝负无穷方向舍入)

  • 正数:等同于 ROUND_DOWN

  • 负数:等同于 ROUND_UP

BigDecimal value7 = new BigDecimal("3.236452").setScale(2, BigDecimal.ROUND_FLOOR);
System.out.println(value7); // 输出:3.23
​
BigDecimal value8 = new BigDecimal("-3.226452").setScale(2, BigDecimal.ROUND_FLOOR);
System.out.println(value8); // 输出:-3.23

2.5、ROUND_HALF_UP(四舍五入)

舍弃部分大于或等于 0.5 时进位,否则截断。

BigDecimal value9 = new BigDecimal("3.235452").setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(value9); // 输出:3.24
​
BigDecimal value10 = new BigDecimal("-3.225").setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(value10); // 输出:-3.23

2.6、ROUND_HALF_DOWN(四舍五入严格版)

舍弃部分大于 0.5 时进位,等于 0.5 时截断。

BigDecimal value11 = new BigDecimal("3.234452").setScale(2, BigDecimal.ROUND_HALF_DOWN);
System.out.println(value11); // 输出:3.23
​
BigDecimal value12 = new BigDecimal("-3.225").setScale(2, BigDecimal.ROUND_HALF_DOWN);
System.out.println(value12); // 输出:-3.22

示例代码(综合应用)

// 示例:计算总内存(结合加减乘除与四舍五入)
BigDecimal memory = new BigDecimal("1024");
BigDecimal decimal = new BigDecimal("0.1");
BigDecimal totalMemory = memory
    .subtract(decimal.multiply(memory)) // 1024 - (0.1 * 1024)
    .divide(new BigDecimal("1024"), 0, BigDecimal.ROUND_DOWN); // 结果取整
System.out.println(totalMemory); // 输出:9

注意事项:

  1. 避免浮点数直接构造:使用 new BigDecimal("字符串") 而非 new BigDecimal(double),以避免精度问题。

  2. 舍入模式选择:根据业务需求选择合适的舍入模式(如财务场景通常使用 ROUND_HALF_UP)。

  3. setScale() 参数:需指定保留的小数位数和舍入模式,否则可能抛出异常。

通过清晰的标题层级和示例代码,内容更易阅读和理解。