大家好!刚踏入MySQL的学习之旅,为了方便地操作MySQL数据库,我们除了学习MySQL的组成方式,还需要掌握操作它的语言,既然有语言,那么必然有数据类型来标明数据的类型,以便系统更好地判断输入的语句是否合法。
既然数据类型这么重要,其中的浮点数类型又大有文章,因而今天让我们来对此一探究竟吧!
浮点数是什么?
数的表现形式除了整数,还有小数,在日常生活中的表示方式为D.D(其中D指代的是整数)。
没错,浮点数就是为了存储小数所构造的数据类型!MySQL中浮点数类型有FLOAT
和DOUBLE
,类型的相关属性如下图所示。
浮点数类型在物理层如何表示?
由于多了一个小数点,数的表现形式就截然不同了。我们都知道在计算机中存储的数都是二进制表示的,由于在同样长度下,小数点位置的不同,会使得数的表示有二义性,而为了避免二义性,似乎需要额外的空间来记录小数点的位置。但从成本上分析,数据库中存储相同的数据当然是占用越少的空间越好。
因此,MySQL的设计者采用了科学计数法的形式来表示:a × 2ⁿ
,其中 1≤|a|<2
,把小数点的后面的数称为尾数,把n
称为指数。通过这样约定,我们只需要表示出尾数和指数的值就能表示出一个小数啦,当然由于小数有正负之分,还需要首位来表示正负号。
默认情况下,FLOAT的精度为23位,DOUBLE的精度为53位,存储方式如下图所示。
另外需要注意的是,从十进制小数转换为二进制的大部分时候是会有精度丢失的。比如0.3,它转化成二进制小数就是一个无限小数,但是我们只能用4个字节或者8个字节来表示这个小数,所以只能进行一些舍入来近似表示,可见这才是为什么说计算机的浮点数表示有时是不精确的。
精度自定义
前面我们说了数据类型是用来对数据进行约束的,MySQL针对这点引入了两个参数,在设置浮点数数据类型的时候可以在类型后面跟上两个参数,分别是M
和D
,其中M
表示该小数最多需要的十进制有效个数,D
表示该小数的小数点后的十进制数字个数。注意注意注意!是十进制的有效个数!
根据上述的定义可以看到,在D相同的情况下,M越大,能够表示的取值范围越大;在M相同的情况下,D越大,能够表示的数越小。并且,M和D的取值并不是无限大的,M的取值范围是1-255,D的取值范围是0-30,并且D的值必须小于M的值。建议在建表的时候根据业务值来进行设定,这样能够利用MySQL内部机制来进行数据格式限定,提高系统的robust。
这里可能有朋友会疑惑,好处难道不是数据占用的空间变小了,能够存储更多数据嘛?
不是的,单精度浮点数类型
FLOAT(M,D)
占用的字节数一直都是4字节,双精度浮点数DOUBLE(M,D)
占用的字节数一直都是8字节,它们占用的存储空间大小并不随着M和D的值的变动而变动。
好啦,今天的介绍就到这里,当然这里有个遗留问题,就是如果数据需要不丢失精度地存储该怎么办?下篇就这个问题介绍一种解决方案,下篇见!