1. 程式人生 > >double和float轉換的問題

double和float轉換的問題

這是一個一分錢引發的血案。案情現場還原
float f = 280.8f;
System.out.println(f*100);
結果是什麼?
結果是:28080.0f(我是這麼想的)
實際結果是:28079.998


既然float處理有問題換double會不會有問題呢?
double f = 280.8d;
System.out.println(f*100);
結果是:28080.0
結果神奇般的達到了預期!是不是換double就好了呢?
再試一下
double f = 280.71d;
System.out.println(f*100);
結果是:28070.999999999996
是不是很坑呢?


再提供一種處理方式
BigDecimal d = new BigDecimal("280.71");
System.out.println(d.multiply(new BigDecimal("100")).doubleValue());
結果是:28071.0
再試試其他資料貌似也沒問題了。


問題原因分析:280.8是十進位制資料,計算機使用二進位制資料表示。浮點數精度7位,double型別精度15位,BigDecimal API上的解釋 Immutable, arbitrary-precision signed decimal numbers. 
所以簡單來說float存在精度丟失。double也存在,只是存在範圍不同。BigDecimal能儲存最大精度。涉及到計算非常在意精度請使用BigDecimal