好的,我们来做一个Java BigDecimal 加减乘除 + 小数舍入模式的超详细教程,内容会包含:
- 为什么用 BigDecimal
- 基本创建方法
- 加减乘除示例
- 常用舍入模式详解(ROUNDING_MODE)
- 注意事项与最佳实践
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 加减乘除 + 舍入模式的超清对照图,像速查表那样一图全记。这样你写代码就不用再翻文档了。
你要我画吗?
发表回复