Precision (field length)         精度(字段长度)

Scale (decimal places)         范围(小数位数)

例如:-4.75, precision=3,scale=2,和符号位无关

详解

MySQL要求精度大于等于范围:

mysql> create table test (a decimal(1,3));
ERROR 1427 (42000): For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 'a').

a的定义如下:

create table test (a decimal(3,1));

a字段长度为3,小数点位数为1,表示范围为99.9 ~ -99.9。如果插入的数据小数点位数比scale大,则对scale+1位置的小数进行四舍五入。例如:99.94存储为99.9,99.95提示溢出,99.949存储为99.9(注意,不是这样的四舍五入逻辑哦:99.949=>99.95=>100.0。只看scale后面的一位。)

看一些例子,加深印象:

mysql> create table test (a decimal(3,3));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into test values (11);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> insert into test values (1);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> insert into test values (0.999);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values (0.9999);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> insert into test values (0.0004);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into test values (0.0005);
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> select * from test;
Field   1:  `a`
Catalog:    `def`
Database:   `test`
Table:      `test`
Org_table:  `test`
Type:       NEWDECIMAL
Collation:  binary (63)
Length:     5
Max_length: 5
Decimals:   3
Flags:      NUM+-------+
| a     |
+-------+
| 0.999 |
| 0.000 |
| 0.001 |
+-------+
3 rows in set (0.00 sec)mysql> drop table test;
Query OK, 0 rows affected (0.00 sec)
mysql> create table test (a decimal(3,0));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test values (-999.3);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into test values (-999.7);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> insert into test values (1999);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> insert into test values (1.0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values (1.3);
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> insert into test values (-1.3);
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> insert into test values (-9.3);
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> insert into test values (-0.3);
Query OK, 1 row affected, 1 warning (0.01 sec)mysql> select * from test;
Field   1:  `a`
Catalog:    `def`
Database:   `test`
Table:      `test`
Org_table:  `test`
Type:       NEWDECIMAL
Collation:  binary (63)
Length:     4
Max_length: 4
Decimals:   0
Flags:      NUM+------+
| a    |
+------+
| -999 |
|    1 |
|    1 |
|   -1 |
|   -9 |
|    0 |
+------+
6 rows in set (0.00 sec)mysql> drop table test;
Query OK, 0 rows affected (0.01 sec)
mysql> create table test (a decimal(3,1));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into test values (1.3);
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values (99.99);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> insert into test values (99.9);
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values (-99.9);
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values (-99.99);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> insert into test values (-99.95);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> insert into test values (-99.949);
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> insert into test values (-99.94);
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> select * from test;
Field   1:  `a`
Catalog:    `def`
Database:   `test`
Table:      `test`
Org_table:  `test`
Type:       NEWDECIMAL
Collation:  binary (63)
Length:     5
Max_length: 5
Decimals:   1
Flags:      NUM+-------+
| a     |
+-------+
|   1.3 |
|  99.9 |
| -99.9 |
| -99.9 |
| -99.9 |
+-------+
5 rows in set (0.00 sec)

顺便提一句关于Result Meta的length计算:

对于decimal来说,scale和precision相等的情况下,整数部分的0要占一位length;scale为0的情况下没有小数点,length会少占一位。再考虑到unsigned,如果是无符号数,则length的计算中还不需要考虑符号位,又可以少占一位。为了处理这些逻辑,MySQL对应代码如下:

inline uint32 my_decimal_precision_to_length_no_truncation(uint precision,uint8 scale,bool unsigned_flag)
{/*When precision is 0 it means that original length was also 0. Thusunsigned_flag is ignored in this case.*/DBUG_ASSERT(precision || !scale);return (uint32)(precision + (scale > 0 ? 1 : 0) +(unsigned_flag || !precision ? 0 : 1));
}

看一个数字-4.75来理解上面的逻辑, -4.75, precision=3,scale=2,unsigned_flag=0,则上面的表达式分解如下:

precison算4、7、5三个数字,(scale > 0 ? 1 : 0)算小数点,(unsigned_flag ? 0 : 1)算符号位;根据上面代码中的注释,(!precision ? 0 : 1)表示数值0的情况,此时忽略符号位,也就是说,即使unsigned_flag=1,只要precision为0的话,负号所占的那一位总是不算,-0总是记作0。

Decimal中Scale和Precision是什么相关推荐

  1. html中scale布局,详细介绍css3的transform中scale缩放

    css即层叠样式表.在网页制作时采用层叠样式表技术,可以有效地对页面的布局.字体.颜色.背景和其它效果实现更加精确的控制.今天小编要给大家分享一篇教程,那就是:详细介绍css3的transform中s ...

  2. python中scale的用法_Python Decimal scaleb()用法及代码示例

    Decimal#scaleb():scaleb()是一个Decimal类方法,该方法将第二个值与其exp相加后返回第一个操作数. 用法:Decimal.scaleb() 参数:十进制值 返回:将第二个 ...

  3. scale html 浏览器,javascript中scale怎么使用?

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  4. python中scale的用法_Tkinter Scale滑块组件的用法

    Tkinter 库中,支持通过滑动滑块(Scale)来设置属性值,最常见的就是设定音量,如图 1 所示便是MAC上的音量调节滑块: 图 1 MAC上的音量控制器 图 2 所示便是 Windows 上的 ...

  5. html5 中scale函数,javascript中scale怎么使用?

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  6. Unity中Scale详解

    1.缩放变换 Scale代表的是缩放. 通常意义下的缩放变换,指的是利用缩放矩阵和物体的齐次坐标相乘而进行变换,缩放矩阵形如: Scalex代表x轴方向的缩放 Scaley代表y轴方向的缩放 Scal ...

  7. python中scale什么意思啊_python数字图像处理(7):图像的形变与缩放

    图像的形变与缩放,使用的是skimage的transform模块,函数比较多,功能齐全. 1.改变图片尺寸resize 函数格式为: skimage.transform.resize(image, o ...

  8. 机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)

    转载自:https://www.cnblogs.com/Zhi-Z/p/8728168.html 摘要: 数据挖掘.机器学习和推荐系统中的评测指标-准确率(Precision).召回率(Recall) ...

  9. python中scale的用法_在netCDF4和Python中使用scale_factor和add_offset的示例?

    如果您想知道如何使用add_offset和scale_factor参数来打包或解包.nc文件中的数据,可以读取here. 使用python(download NCEP reanalysis I dat ...

最新文章

  1. linux环境调用gsoap,Linux下gSOAP的使用 (c++)
  2. Centos7 修改运行级别
  3. 文本编辑器中菜单栏删除功能的实现
  4. 从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念
  5. Android开源框架源码鉴赏:Fresco
  6. c3p0获取连接Connection后的Close()---释疑
  7. ASP.NET2.0 ObjectDataSource的使用详解(1)
  8. 小翔和泰拉瑞亚(线段树+思维)
  9. TIME_WAIT状态的一些总结
  10. JavaScript | 用户定义函数的一些示例
  11. KETTLE调度第三篇:Windows下调度Dos脚本编写和遇到的一些问题解决
  12. j2me游戏改成android,将j2me移植成android
  13. 爬取淘宝买家秀,sign值的生成
  14. VS Code插件离线安装教程
  15. [踩坑记录]VS2017+大恒MER-131-210U3C相机
  16. 移动端adaptive设置
  17. 万众电子期刊在线阅读系统(awd复现)
  18. 【Java中实现微信公众号模板消息推送】
  19. es like and or_广东生态所孙蔚旻团队ESamp;T发表利用稳定同位素示踪宏基因组分箱联用技术揭示砷污染土壤中的厌氧砷氧化微生物及其代谢途径...
  20. 用mysql+php开发网上商城系统

热门文章

  1. 因式分解理论基础(4)不可约多项式与唯一因式分解定理
  2. Strusts2简单入门教程
  3. SAINT:一个基于transformer的知识跟踪模型
  4. 全球首个冰冻环境下的海上风电场完工
  5. 量化交易入门之vnpy简单策略编写
  6. Ubcoin市场:加密货币-商品交易平台
  7. 夏惊鸣:2017,战略转型的新路径
  8. FHS(Filesystem Hierarchy Standard)文件系统目录标准
  9. 夯实基础 js数据类型
  10. redis安装,redis安装windows服务