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

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,否则会浪费存储空间
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • mysql Decimal 运算;

    MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。...要定义数据类型为DECIMAL的列,请使用以下语法: column_name DECIMAL(P,D); 在上面的语法中: P是表示有效数字数的精度。 P范围为1〜65。...D的范围是0~30。MySQL要求D小于或等于P。 与INT数据类型一样,DECIMAL类型也具有UNSIGNED和ZEROFILL属性。...decimal(5,2) -- 取值范围是 -999.99 到 999.99 ); ALTER TABLE decimal_test MODIFY score DECIMAL(6,3) UNSIGNED...传decimal 类型数据 让mysql 做计算仍然会出现误差, 最终方案是将其在更新之前 获取结果,最终直接给mysql 传递需要更改的值,做存储就好!!

    2.9K30

    float double取值范围_double float区别

    Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个东西...(1).符号位(S):最高位(31位)为符号位,表示整个浮点数的正负,0为正,1为负; (2).指数位(E):23-30位共8位为指数位,这里指数的底数规定为2(取值范围:0-255)。...这一部分的最终结果格式为: 2 E − 127 2^{E-127} 2E−127,即范围-127~128。...取值范围 根据表1可知,float的取值范围: 负无穷 —— − 2 128 -2^{128} −2128 ~~~ − 2 − 149 -2^{-149} −2−149 —— 0 —— 2 −...上面的“——”表示中间不能取值,例如负无穷到 − 2 128 -2^{128} −2128中间的值是取不到的(事实上128也是取不到的,只是接近近似值),但这并不是意味着,“~”任意值都能取到的,要注意

    2.9K10

    MySQL数据类型DECIMAL用法

    1.DECIMAL类型简介 DECIMAL从MySQL 5.1引入,列的声明语法是DECIMAL(M,D)。...NUMERIC与DECIMAL同义,如果字段类型定义为NUMERIC,则将自动转成DECIMAL。 对于声明语法DECIMAL(M,D),自变量的值范围如下: M是最大位数(精度),范围是1到65。...> insert into decimal_tb (col2) values (12.2300); Query OK, 1 row affected (0.01 sec) # 变量范围测试# 结论:M范围是...这里总结下使用DECIMAL应该注意的事项: DECIMAL(M,D)中,M范围是1到65,D范围是0到30。 M默认为10,D默认为0,D不大于M。...DECIMAL(5,2)可存储范围是从-999.99到999.99,超出存储范围会报错。 存储数值时,小数位不足会自动补0,首位数字为0自动忽略。 小数位超出会截断,产生告警,并按四舍五入处理。

    2.9K20

    MySQL数据类型DECIMAL详解

    1.DECIMAL类型简介 DECIMAL从MySQL 5.1引入,列的声明语法是DECIMAL(M,D)。...NUMERIC与DECIMAL同义,如果字段类型定义为NUMERIC,则将自动转成DECIMAL。 对于声明语法DECIMAL(M,D),自变量的值范围如下: M是最大位数(精度),范围是1到65。...M范围是1到65,D范围是0到30,且D不大于M mysql> alter table decimal_tb add column col3 decimal(6,6); Query OK, 0 rows...这里总结下使用DECIMAL应该注意的事项: DECIMAL(M,D)中,M范围是1到65,D范围是0到30。 M默认为10,D默认为0,D不大于M。...DECIMAL(5,2)可存储范围是从-999.99到999.99,超出存储范围会报错。 存储数值时,小数位不足会自动补0,首位数字为0自动忽略。 小数位超出会截断,产生告警,并按四舍五入处理。

    44.4K41
    领券