mysql神功 2.2 数据类型的细分之浮点数类型与定点数类型
讲解之前,先回答大家一个问题,好多小伙伴买了各种MySQL书籍,讲到这里时,书中都会声明Float和Double类型的取值范围,还是用科学计数法写的,其实这个范围与你无关。

如图2-18,我们在玩「和平精英」时,我们从A地到B地,有一个必经的路口,直行距离最近,但是可能会遇到敌人,无论左转还是右转都有毒圈,你去计算毒圈会损你多少血是没有意义的,除非走投无路了,否则我们应该不进入毒圈。
一、什么是精度

小学数学知识:数级与数位:图2-19
数级:个级、万级、亿级......
数位:个位、十位、百位、千位、万位、十万位、百万位、千万位、亿位......
我们生活中,最常用的精度就是抹零,记得小时候去商店买东西,差一分钱都不行,现在买东西,不足1角钱都不收了直接抹零。你去4S店买车,车款(不是落地价)直接到整千,千元以下直接抹零。但是你的工资从不抹零,也不会四舍五入。例如,你的工资9458.32元,我给你9000元或9400元,甚至9450元,你都会来找我。但是我给你9500元你可能就不说话了。
你想过没有,如图2-20,如果公司给我3万元,让我给三个人发工资,我发给张三9500元,发完李四的工资后,就不够发王五了,只有保持精度,才能发完所有人的工资。

二、FLOAT单精度浮点数类型【4个字节】
我设计了一个表,就两个字段,longtext类型我是存放我输入的数据用于核对FLOAT数据类型,因为单精度浮点数据类型会在满足一定条件后,“改变”数据的精确度。图2-21

我在表中【长文本】与【单精度浮点数据类型】两个字段输入相同数字,保存再打开后,会发现【单精度浮点数据类型】字段的值变了。如图2-22

最终我们总结了一个道理,在FLOAT类型中存放的数字,不超过6个数字(与正负号和小数点无关,只看数字)时,我们的数据精确度不变。
但是这个习惯不好,在这里用1、2、3、4、5、6、7是没什么区别的,但是好习惯是用9

图2-23
仍然是只能保持6个有效数字时精度不变,无论整数还是小数,无论正数还是负数。为什么好习惯是用9,往后看DOUBLE双精度就知道了。
FLOAT类型占用4个字节,能保存整数和小数,如果单纯保存整数,上节课讲的MEDIUMINT类型只能保存整数占用3个字节,最少能保存7位数(有符号时)。
所以说:FLOAT类型只有数据中可能会包含小数时才会使用,只能保存6个有效数字时精度不变。例如:工资就不适合保存这种类型,13258.28元使用FLOAT类型后会变成13258.3元。
如图2-18所示,你左转(FLOAT类型)遇到「和平精英」毒圈后的结果(变成什么值)不用考虑,你应该做的是避开毒圈(不多于6位有效数字)。
三、DOUBLE双精度浮点数类型【8个字节】
再做一张表,两个字段

为什么用9测试,不相信我你用1测试,得到的结果肯定比我的位数多,但是你能保证你的数字不会达到上限吗?我得到的结果位置比你少,但是准备度有保证。好比,一条没有分叉的路,不同地方高度不同,那么进入这条路时,限高杆应该以最低高度为限。如图2-25

正数负数都是一样的,我就没再把图帖出来,最终我总结了一张表:如图2-26

如图2-18所示,你右转(DOUBLE类型)遇到「和平精英」毒圈后的结果(变成什么值)不用考虑,你应该做的是避开毒圈(符合图2-26的要求)。
Ps:从MySQL 8.0.17开始,官方文档中明确FLOAT(M,D) 和DOUBLE(M,D)用法已不推荐使用,我将不再介绍相关内容。你记得这两个数据类型的长度和小数点这两个参数默认为0就好了。
浮点数类型虽然占用空间少,但是我仍不推荐你使用浮点数类型,因为它们是数字,是数字就要进行计算,你现在符合规则存好了,将来计算结果超出规则,也会被修改精度。
友情提示:我测试精度是基于 MySQL 8.0 64位 + Win10系统,MySQL支持很多平台,如果你使用小众平台或专业平台,建议自行测试。因为Float和Double默认参数时,精度由计算机硬件和操作系统决定。
四、DECIMAL(M,D)定点数类型(占用空间不固定)
DECIMAL(M,D) 翻译:DECIMAL(长度,小数点)

定点数类型优点:精确度高,不存在浮点数类型那样修改精度的问题,比如:造航天飞机的数据就不能使用浮点数类型,这时定点数类型就是不错的选择。
定点数类型缺点:占用存储空间的大小取决于M和D,占用空间可能会比浮点数类型更大。
问:为什么定点数类型占用空间大呢?
答:算法问题,浮点数类型是直接把数存进去,当超过位数时,精确度会被修改。定点数类型是将整数部分和小数部分都转化成整数保存,你看到的是小数。

DECIMAL默认参数是:DECIMAL(10,0)
验证一下:当你没有设置长度和小数点时(全是0)图2-29

保存后再进入设计表,这里就会变成如图2-30,这就是默认

长度和小数点你可以调整参数,长度最大65,小数点最大30,如果你的数超出范围,是不让你保存的。图2-31

你将长度改成1都可以,如图2-32

但是,在保存数据时,你输入1位数没问题,输入2位数,就会弹出错误。图2-33

最后还要注意:小数的位数不能超过数字的总长度这个很好理解,所以D不能大于M。如图2-34
