问题描述
使用navicat
存储一个float
类型的小数,添加字段后,其他的保持默认设置。
然后存一条数据,float
类型的数据为129364.57
。保存后的结果:
舍弃了小数部分,然后四舍五入为129365
。
然后又重新试了几个其他的小数,发现都是这个情况。
猜测
1.联想到以前学C语言的时候,不同数据类型所占长度不同,所以就猜测可能是精度不够了。
因为是二进制,所以在存储小数的时候只能有2的负n次幂
这样的相加得出的小数,所以我就试一下129364.25
,依然不行,还是没有小数部分,只有整数部分,并且同样满足四舍五入。
所以不是精度的问题。
2.既然没有小数,是不是默认没有小数部分呢。
然后重新设计表,发现果然小数部分为0,然后将其改为2:
再重新测试:
正常保存!
后续
google了一下网上的答案,发现有对存储长度的限制,然后就去官方文档看了看。
标题就很能说明问题
估计值
。感觉官方文档并没有说什么东西,但是我们知道了float
的估计是有长度和精度两个参数控制的。然后再结合google的结果,发现float
只支持8位
,当整数加小数部分超出8位,它就开始估计
了。
当然也不是说所有的8位都可以,也是有个范围的,因为float
使用4个字节,所以当数值大小超过65536
(2的16次方),即使八位数也是会出现估计
的现象。比如我们存一个65536.777
,但是保存后结果确不是这个数:
总结
1.小于65536
,8位以内数字正常显示;超出8位进行近似估计
(也就是数值不准)。
2.大于65536
,接近8位的数字开始估计
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。