最近在項目上遇到一個新奇的問題與大家分享一下,情況如下:
頁面新增一個777777777數傳到后台,保存之后變成777777790;
查到原因是后台用float.valueof()轉換了一下;
繼續深挖,float基本屬性如下:
基本類型:float 二進制位數:32
包裝類:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38
這些都不是重點,重點是float是單精度;
float和double的范圍是由指數的位數來決定的。
float:
1bit(符號位)
8bits(指數位)
23bits(尾數位)
在數學中,特別是在計算機相關的數字(浮點數)問題的表述中,有一個基本表達法
(浮點)數值 = 尾數 × 底數 ^ 指數,(附加正負號)
float:2^23 = 8388608,一共七位,這意味着最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;
通俗點就是: 777777777 ——》 7.7777779E8 ——》777777790
所以在進行大尾數計算建議用Double.valueOf();