1

问题描述

使用navicat存储一个float类型的小数,添加字段后,其他的保持默认设置。

clipboard.png

然后存一条数据,float类型的数据为129364.57。保存后的结果:

clipboard.png

舍弃了小数部分,然后四舍五入为129365

然后又重新试了几个其他的小数,发现都是这个情况。

猜测

1.联想到以前学C语言的时候,不同数据类型所占长度不同,所以就猜测可能是精度不够了。

因为是二进制,所以在存储小数的时候只能有2的负n次幂这样的相加得出的小数,所以我就试一下129364.25,依然不行,还是没有小数部分,只有整数部分,并且同样满足四舍五入。

所以不是精度的问题。

2.既然没有小数,是不是默认没有小数部分呢。

然后重新设计表,发现果然小数部分为0,然后将其改为2:

clipboard.png

再重新测试:

clipboard.png

正常保存!

后续

google了一下网上的答案,发现有对存储长度的限制,然后就去官方文档看了看。

标题就很能说明问题

clipboard.png

估计值。感觉官方文档并没有说什么东西,但是我们知道了float的估计是有长度和精度两个参数控制的。然后再结合google的结果,发现float只支持8位,当整数加小数部分超出8位,它就开始估计了。

当然也不是说所有的8位都可以,也是有个范围的,因为float使用4个字节,所以当数值大小超过65536(2的16次方),即使八位数也是会出现估计的现象。比如我们存一个65536.777,但是保存后结果确不是这个数:

clipboard.png

总结

1.小于65536,8位以内数字正常显示;超出8位进行近似估计(也就是数值不准)。
2.大于65536,接近8位的数字开始估计


喵先生的进阶之路
348 声望21 粉丝