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,最后使用也会移位。