BigDecimal 精度问题
面试官问:"为什么不能用 double 做金额计算?"
候选人小孟答:"因为 double 有精度损失。"
面试官追问:"0.1 + 0.2 等于多少?"
小孟说:"0.3?"
面试官:"你自己运行一下代码看看。"
小孟运行后发现是 0.30000000000000004。
小孟愣住了。
【面试官心理】 这道题看似简单,但能准确说出浮点数精度问题根源的候选人不多。追问 double 不能用于金额计算的原因,是测试候选人对数值类型的理解深度。
一、浮点数精度问题根源 🔴
1.1 为什么 0.1 + 0.2 ≠ 0.3
原因:0.1 在二进制中是无限循环小数,只能近似表示:
1.2 double 的 IEEE 754 标准
二、BigDecimal 基础 🔴
2.1 创建 BigDecimal 的陷阱
⚠️
永远不要用 new BigDecimal(double) 创建金额计算用的 BigDecimal。一定要用 new BigDecimal(String) 或 BigDecimal.valueOf(double)。
2.2 BigDecimal 的内部表示
三、金额计算的规范操作 🔴
3.1 加减乘除
3.2 设置精度和舍入模式
3.3 金额计算的坑
四、equals vs compareTo 🟡
五、生产金额计算工具类 🟡
六、追问升级
面试官:"BigDecimal 是线程安全的吗?"
【面试官心理】 能说出 BigDecimal 不可变性的候选人,说明理解并发编程的基本原则。这是 P6 的要求。