在 MySQL 中,DECIMAL 是一种用于存储精确数值的数据类型,特别适合需要高精度计算的场景,比如财务数据、货币金额等。与浮点数类型(如 FLOAT 和 DOUBLE)不同,DECIMAL 不会出现舍入误差,因为它是以固定精度存储的。
DECIMAL 的基本语法DECIMAL(M, D)或等价的:
NUMERIC(M, D) -- 在 MySQL 中,NUMERIC 和 DECIMAL 是同义词其中:
⚠️ 注意:
D不能大于M,即小数位数不能超过总位数。
DECIMAL 的取值范围DECIMAL(M, D) 的取值范围取决于 M 和 D 的值,可以按以下公式计算:
最大值 ≈ 10^(M-D) - 1 / 10^D或者更直观地理解为:
M - D 位D 位所以:
10^(M-D) - 1(整数部分) + 0.999...(小数部分)-10^(M-D) + 1(整数部分) - 0.000...(小数部分)定义 | 含义 | 取值范围(大约) |
|---|---|---|
DECIMAL(5,2) | 总共 5 位数字,其中 2 位是小数 | -999.99 到 999.99 |
DECIMAL(10,2) | 总共 10 位数字,其中 2 位是小数 | -99999999.99 到 99999999.99 |
DECIMAL(15,5) | 总共 15 位数字,其中 5 位是小数 | -99999999999.99999 到 99999999999.99999 |
DECIMAL(65,30) | 最大允许精度 | 理论上可以表示非常大的数值,小数点后 30 位 |
DECIMAL 的存储空间MySQL 中 DECIMAL 的存储空间计算方式如下:
剩余位数 | 所需字节数 |
|---|---|
1–2 | 1 字节 |
3–4 | 2 字节 |
5–6 | 3 字节 |
7–9 | 4 字节 |
总存储空间 = ceil((M + 1) / 9) * 4 字节 (加 1 是因为需要额外一位存储符号)
⚠️ 注意:这个计算是近似值,实际由 MySQL 内部决定。
例如:
DECIMAL(10,2):
DECIMAL(15,5):
DECIMAL(20,2):
DECIMAL vs FLOAT / DOUBLE特性 | DECIMAL | FLOAT / DOUBLE |
|---|---|---|
存储方式 | 精确存储(定点数) | 近似存储(浮点数) |
是否有舍入误差 | ❌ 没有 | ✅ 有 |
适用场景 | 财务、货币、需要精确计算的场景 | 科学计算、统计分析等允许误差的场景 |
存储空间 | 较大(取决于 M 和 D) | 较小(固定 4 字节或 8 字节) |
精度 | 高(可自定义) | 较低(固定精度) |
✅ 如果你需要确保数值的绝对精确性(如金额计算),一定要使用
DECIMAL。
DECIMAL(10,2),即总共 10 位数字,其中 2 位是小数(可以表示最大 99999999.99)M 和 D,如 DECIMAL(30,10)M 和 D,否则会浪费存储空间没有搜到相关的沙龙