日期:2026-07-11
难度:简单
标签:#面试 #MySQL #DECIMAL #金额 #VIP
一句话答案
金额通常使用 DECIMAL(M,D) 保存精确十进制定点数,或在业务明确最小货币单位时用 BIGINT 保存整数分;不要用 FLOAT、DOUBLE 处理需要精确结算的金额。
面试口语版
金融金额不能容忍二进制浮点误差,所以常用 DECIMAL,例如 DECIMAL(18,2) 表示总共 18 位、其中 2 位小数。若系统统一以“分”为最小单位,也可以用 BIGINT 存整数,计算简单且性能稳定,但要明确币种和小数位,不能把不同币种直接相加。选精度时要覆盖单笔上限、累计金额、税率折扣和中间计算;应用层也要用 BigDecimal 一类精确类型,并统一舍入规则。
原理拆解
| 方案 | 优点 | 风险/适用边界 |
|---|---|---|
| DECIMAL | 直观、精确、支持小数位 | 要设计精度和舍入 |
| BIGINT 最小单位 | 整数运算、约束清晰 | 多币种/不同小数位需元数据 |
| FLOAT/DOUBLE | 范围大、计算快 | 二进制近似,不适合精确结算 |
关键细节
DECIMAL(18,2)的 M 是总位数,D 是小数位数。- 金额字段还应配币种代码;金额本身不能脱离币种解释。
- 折扣、汇率、税率往往需要比最终展示金额更多的小数位,最后一步统一舍入。
面试官追问
- 为什么 0.1 用 DOUBLE 可能不精确?
- DECIMAL(18,2) 最大能存多少?
- 多币种如何设计?
高分补充
金额正确性是数据库类型、应用类型、舍入模式、币种和审计链路共同保证的。
学习清单
- 准备 DECIMAL 与 BIGINT 分单位两套方案的取舍。