首页
学习
活动
专区
圈层
工具
发布

mysql decimal取值范围

在 MySQL 中,DECIMAL 是一种用于存储​​精确数值​​的数据类型,特别适合需要高精度计算的场景,比如财务数据、货币金额等。与浮点数类型(如 FLOATDOUBLE)不同,DECIMAL 不会出现舍入误差,因为它是以​​固定精度​​存储的。


一、MySQL 中 DECIMAL 的基本语法

代码语言:javascript
代码运行次数:0
复制
DECIMAL(M, D)

或等价的:

代码语言:javascript
代码运行次数:0
复制
NUMERIC(M, D)  -- 在 MySQL 中,NUMERIC 和 DECIMAL 是同义词

其中:

  • ​M​​(Precision,精度):表示​​总共可以存储多少位数字​​(包括整数部分和小数部分),范围是 ​​1 到 65​
  • ​D​​(Scale,标度):表示​​小数点后可以存储多少位数字​​,范围是 ​​0 到 M​

⚠️ 注意:D 不能大于 M,即小数位数不能超过总位数。


二、DECIMAL 的取值范围

DECIMAL(M, D) 的​​取值范围​​取决于 MD 的值,可以按以下公式计算:

1. 最大值:

代码语言:javascript
代码运行次数:0
复制
最大值 ≈ 10^(M-D) - 1 / 10^D

或者更直观地理解为:

  • 整数部分最多可以有 M - D
  • 小数部分最多可以有 D

所以:

  • ​最大正数值​​ ≈ 10^(M-D) - 1(整数部分) + 0.999...(小数部分)
  • ​最小负数值​​ ≈ -10^(M-D) + 1(整数部分) - 0.000...(小数部分)

2. 举个例子说明:

定义

含义

取值范围(大约)

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 的存储空间计算方式如下:

  • 每 9 位数字需要 ​​4 字节​​ 存储
  • 剩余的数字(不足 9 位)按以下规则占用字节:

剩余位数

所需字节数

1–2

1 字节

3–4

2 字节

5–6

3 字节

7–9

4 字节

​总存储空间 = ceil((M + 1) / 9) * 4 字节​​ (加 1 是因为需要额外一位存储符号)

⚠️ 注意:这个计算是近似值,实际由 MySQL 内部决定。

例如:

  • DECIMAL(10,2)
    • 总位数 M = 10
    • 需要 ceil((10 + 1) / 9) = 2 个“9位块”
    • 存储空间 = 2 × 4 = ​​8 字节​
  • DECIMAL(15,5)
    • ceil((15 + 1) / 9) = 2
    • 存储空间 = 2 × 4 = ​​8 字节​
  • DECIMAL(20,2)
    • ceil((20 + 1) / 9) = 3
    • 存储空间 = 3 × 4 = ​​12 字节​

四、DECIMAL vs FLOAT / DOUBLE

特性

DECIMAL

FLOAT / DOUBLE

存储方式

精确存储(定点数)

近似存储(浮点数)

是否有舍入误差

❌ 没有

✅ 有

适用场景

财务、货币、需要精确计算的场景

科学计算、统计分析等允许误差的场景

存储空间

较大(取决于 M 和 D)

较小(固定 4 字节或 8 字节)

精度

高(可自定义)

较低(固定精度)

✅ 如果你需要确保数值的​​绝对精确性​​(如金额计算),一定要使用 DECIMAL


五、实际使用建议

  • 如果你存储的是货币(如人民币、美元),推荐使用 DECIMAL(10,2),即总共 10 位数字,其中 2 位是小数(可以表示最大 99999999.99)
  • 如果你需要存储更大范围的数值,比如科学数据,可以使用更大的 MD,如 DECIMAL(30,10)
  • 不要随意设置过大的 MD,否则会浪费存储空间
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券