1. 程式人生 > >精確運算不能用float/double,用什麼型別?

精確運算不能用float/double,用什麼型別?

為什麼不是2.2

float f1=2.1;

float f2=0.1;

float f3=f1+f2;

精確運算不能用float/double,用什麼型別? 

為什麼說不能用floatdouble來進行精確小數計算呢?

System.out.println(1.03- .42);//答案是0.6100000000000001 System.out.println(1.00-9*.10);//答案是0.09999999999999995 

是因為floatdouble不能精確的表達0.1,或者任何10的負n次方。他們是設計來進行科學和工程上的計算,提供精確的近似值的。它們在涉及金融方面的計算則是不在行的。因為金融方面要求絕對的精確。

解決方法

BigDecimal

int或者long

BigDecimal bd =new BigDecimal("1.00");

把所有牽涉到的小數都以這種方式轉變為BigDecimal物件,然後用它提供的方法進行計算。

你就得到了精確的計算結果

兩個小缺點,一個。。。很顯然,就是比直接用原始型別要麻煩,也不能用+,-,*,/這些直觀的符號了;第二個就是速度會慢一點,如果不是用於大量的迴圈之中,則不是那麼要緊。不過,你也同時得到了一個好處,BigDecimal類還帶了豐富的舍入方法,也是不錯的。

如果小數位本身不長,則可以用int或者long來替代,我想你明白這個方法是什麼意思的。在速度必須很快的位置,你又不介意自己看著小數點位,這個還是可用的,但如果數字本身超過了

18位,就只能用BigDecimal了。

使用BigDecimal要用String來夠造,要做一個加法運算,需要先將兩個浮點數轉為String,然後夠造成BigDecimal,在其中一個上呼叫add方法,傳入另一個作為引數,然後把運算的結果(BigDecimal)再轉換為浮點數。