java 浮點類型float 和 double和BigDecimal

問題:amount是float 賦值會向上取整這是什麼原因啊

現象

在這裏插入圖片描述

原理

菜鳥教程的詳細解說
資料

float 的小數位只有 23 位,即二進制的 23 位,能表示的最大的十進制數爲 2 的 23 次方,即 8388608,即十進制的 7 位,嚴格點,精度只能百分百保證十進制的 6 位運算。
double的小數位有 52 位,對應十進制最大值爲 4 503 599 627 370 496,這個數有 16 位,所以計算精度只能百分百保證十進制的 15 位運算。

實踐

只有7位有效數字的正常
在這裏插入圖片描述
8位有效數字就出現異常了
在這裏插入圖片描述

結論

float和double的精度是由尾數的位數來決定的。浮點數在內存中是按科學計數法來存儲的,其整數部分始終是一個隱含着的“1”,由於它是不變的,故不能對精度造成影響。
float:2^23 = 8388608,一共七位,這意味着最多能有7位有效數字,但絕對能保證的爲6位,也即float的精度爲6~7位有效數字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度爲15~16位。

建議

1.涉及金額的都改爲Bigdecimal
2.或者自己合理分析數據他到底有多少位,再去選用float或者double

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章