1. DECIMAL 类型
特点:
- 精确存储:
DECIMAL类型用于存储精确的定点数,适合存储需要精度的财务、货币等数据。 - 存储方式:通常以字符串或压缩的二进制表示存储。
- 精度和标度:用户可以指定总的数字位数(
precision)和小数位数(scale)。- 例如,
DECIMAL(10, 2)表示最多 10 位数字,其中有 2 位是小数。
- 例如,
空间占用:
- 空间公式:
- 每 9 位数字需要 4 个字节存储。
- 如果总位数不能被 9 整除,多出来的数字需要额外的字节存储:
- 1~2 位数字:1 字节
- 3~4 位数字:2 字节
- 5~6 位数字:3 字节
- 7~9 位数字:4 字节
- 额外的 1 字节存储符号信息。
举例:
DECIMAL(10, 2):- 总位数 10。
- 10 / 9 = 1 组完整的 9 位,需 4 字节。
- 剩下 1 位,需 1 字节。
- 符号位需 1 字节。
- 总计:4 + 1 + 1 = 6 字节。
2. DOUBLE 类型
特点:
- 近似存储:
DOUBLE是浮点类型,基于 IEEE 754 标准存储,允许存储非常大的或非常小的数字,但会有舍入误差。 - 存储方式:以二进制浮点数表示,包括符号位、指数位和尾数位。
- 精度:提供 15~17 位十进制有效数字,超出范围的数据会近似存储。
空间占用:
- 固定占用 8 字节(64 位),包括:
- 1 位:符号位。
- 11 位:指数部分。
- 52 位:尾数部分(实际有效位 53 位,包括隐含的最高位)。
3. 比较
| 属性 | DECIMAL | DOUBLE |
|---|---|---|
| 存储精度 | 精确存储,无舍入误差 | 近似存储,有舍入误差 |
| 空间占用 | 根据精度和标度变化,6~16 字节左右 | 固定占用 8 字节 |
| 性能 | 计算和存储效率较低 | 计算和存储效率较高 |
| 适用场景 | 金融、货币等要求精度的场景 | 科学计算、大范围数值存储 |
4. 实际选择
- 选择
DECIMAL:- 当需要高精度计算时,例如财务和货币场景。
- 即使占用更多存储空间,也能保证结果不受舍入误差影响。
- 选择
DOUBLE:- 当需要高性能计算或存储范围较大的数据时。
- 对精度要求不严格,例如科学计算和统计分析。
举例:
DECIMAL底层存储实际是转成整数,然后根据统一的标度还原,比如存储120,标度 2,实际存储的是12000,还原会 左移两位,存储0.12,实际存储12,最后使用也会移位。