解決double和float精度不准的問題

2021-07-10 14:47:28 字數 737 閱讀 9204

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...