1. 为什么需要BigDecimal
第一次用double做金额计算时,我被0.1+0.2的结果惊到了——居然输出0.30000000000000004!这个经典浮点数精度问题让我意识到,金融计算必须用BigDecimal。这不是Java的bug,而是IEEE 754浮点数标准的固有缺陷:用二进制无法精确表示某些十进制小数。
关键教训:涉及金额、税率、科学计算等场景,绝对不要用float/double
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. BigDecimal核心原理剖析
2.1 存储结构解密
BigDecimal内部通过三个关键字段实现精确计算:
intVal:存储未缩放整数值(如1.23存为123)scale:小数点位数(示例中为2)precision:有效数字位数(示例中为3)
这种"整数+缩放因子"的存储方式,完全规避了二进制浮点误差。
2.2 四种舍入模式实战对比
通过贷款利息计算案例演示不同模式差异:
| 模式 | 1.235结果 | 适用场景 |
|---|---|---|
| UP | 1.24 | 保守计费 |
| DOWN | 1.23 | 让利客户 |
| HALF_UP | 1.24 | 银行主流 |
| HALF_EVEN | 1.24 | 统计优选 |
踩坑记录:HALF_UP在5舍6入时可能造成累计误差,批量处理建议用HALF_EVEN
3. 工具类开发实录
3.1 安全转换方案
java复制public static BigDecimal safeConvert(Object input) {
if (input == null) return null;
try {
return new BigDecimal(input.toString().trim());
} catch (Exception e) {
log.warn("转换异常:{}", input);
return BigDecimal.ZERO; // 根据业务调整默认值
}
}
3.2 精度控制工具
java复制/**
* @param nu
