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

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用法

    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.5K41

    谈谈MySQL如何选择float, double, decimal

    前言 我们知道在MySQL中有3种类型可以表示实数,分别是float,double和decimal。关于如何合理得使用这三种类型,网上的答案也层出不穷。...但是decimal类型是MySQL官方唯一指定能精确存储的类型,也是DBA强烈推荐和金钱相关的类型都要存储为decimal类型,如果猜想decimal类型的存储格式的话,那么一下两种可以保持数据的准确性...继续扩大存储空间,比double更大一个级别,比如128位甚至更多 通过字符串化或者其他的方式特殊存储起来 这两种方式都能实现decimal精确存储,但是由于MySQL指定decimal类型最大长度为...65.在我们能测试的范围内,decimal并没有出现误差。...作为MySQL官方唯一指定精确存储的decimal类型,后续有精力再研究为什么能做到精确todo 如何选择float,double,decimal 结论总是放在最后,根据上面的分析:可以得出以下结论 1

    6.7K42

    知识分享之MariaDB——各种数据类型的取值范围

    知识分享之MariaDB——各种整数取值范围 背景 日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家...MariaDB 内容 在使用MariaDB数据库时,我们需要创建各种各样的表结构,而表结构中存储一些数字或状态时为了更好的发挥性能,我们需要根据场景使用不同的字段类型来进行存储,下面是我整理出来的数据类型的相关取值范围...类型名称 无符号限定取值范围 有符号限定取值范围 说明 bit -128到127 一种位字段类型(二进制) tinyint[(M)] 0到255 -128到127 一个特别小的整数 smallint[...1.175494351E -381.175494351E-38至3.402823466E + 38 一个小的单精度浮点数,M是总的数字,D是小数点后的数字(不推荐) 以上就是我们比较常用的数据类型的取值范围

    83730
    领券