問題描述
使用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位的數字開始估計
。