float和double型,的底層實現是二進位制的。十進位制中的乙個有限位數小數,轉換成二進位制就不一定是有限位數了,一旦位數超過的float和double型的位數寬度,就會出現「精度溢位」。所以float和double型是為了科學計算而設計的,並不適合精確的十進位制計算.
就像乙個十進位制的小數,要不斷地乘以2取整,但在這個過程中可能會一直迴圈下去,這就造成了資料的不精確。
所以在必須要求資料的精確度時,不能使用float和double.
public class test }
輸出結果為:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
bigdecimal類可解決計算精度問題可使用bigdecimal類建立乙個封裝類。封裝加減乘除操作
例:對乙個小數進行指定位數的四捨五入:
bigdecimal bd = new bigdecimal("0.9851095");
bigdecimal one = new bigdecimal("1");
system.out.println(bd.divide(one, 3, bigdecimal.round_half_up));
bigdecimal中還有很多相關的數值之間的計算方法,以及精確到的位數和四捨五入等。
C 學習 float與double的範圍和精度
float和double的範圍是由指數的位數來決定的。float的指數字有8位,而double的指數字有11位,分布如下 float 1bit 符號位 8bits 指數字 23bits 尾數字 double 1bit 符號位 11bits 指數字 52bits 尾數字 於是,float的指數範圍為 ...
解決double和float精度不准的問題
float和double型,的底層實現是二進位制的。十進位制中的乙個有限位數小數,轉換成二進位制就不一定是有限位數了,一旦位數超過的float和double型的位數寬度,就會出現 精度溢位 所以float和double型是為了科學計算而設計的,並不適合精確的十進位制計算.就像乙個十進位制的小數,要不...
double和float的區別
float a 0.1 編譯器報錯 warning c4305 initializing truncation from const double to float 原因 在c c 中 也不知道是不是就在vc 中這樣 上述語句等號右邊0.1,我們以為它是個float,但是編譯器卻把它認為是個doub...