-
浮点型数据类型
float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;
MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)表示总长度是7位,小数点后面的长度是4,可显示为999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。 -
float:单精度浮点型,占字节数为4,用32位二进制描述,有符号是7个有效位,无符号是8个有效位
double:双精度浮点型,占字节数为8,用64位二进制描述,有符号是15个有效位,无符号是16个有效位
decimal:数字型,用128位二进制描述,不存在精度损失,常用于银行帐目计算。(28个有效位)
解释:单精度和双精度
精度是指计算机表达小数近似值的一种方式,单精度32位二进制,4个字节;双精度64位二进制,8个字节。 -
丢失数据的原因是因为单精度类型float和双精度类型double在计算机中存储的时候,由于计算机只能存储二进制,所以浮点型数据在存储的时候,必须转化成二进制。我们知道对于float类型的数据,只分配了32位的存储空间,对于double类型值分配了64位,但是并不是所有的小数都能转成32位或者64位的二进制形式,如果超过了,就会出现截断,这就是误差的来源。
针对float情况,至少我们可以得出结论:
- 如果一个float型数据转成二进制后的第32位之后都是0,那么数据是准的
- 如果一个float型数据转成二进制后的第32位之后不全为0,则数据就会存在误差
float和double类型的区别和误差来源。但是decimal类型是MySQL官方唯一指定能精确存储的类型,也是DBA强烈推荐和金钱相关的类型都要存储为decimal类型。
选择float或者double或者decimal有时候也要看场景,比如我们可以用double存储一个小商铺的季度营业额(几千万),单独用double存储的时候没有问题,当多个季度,多个年份,算总营业额时,就可能出现问题,再也算不出一个准确的答案。所以,如果考虑情况没那么有把握的情况下,推荐使用decimal。