1. 程式人生 > >java float double型別做小數點加減運算不準確

java float double型別做小數點加減運算不準確

一提到Java裡面的商業計算,我們都知道不能用float和double,因為他們無法 進行精確計算。但是Java的設計者給程式設計人員提供了一個很有用的類BigDecimal,他可以完善float和double類無法進行精確計算的缺 憾。BigDecimal類位於java.maths類包下。首先我們來看下如何構造一個BigDecimal物件。它的建構函式很多,我挑最常用的兩個 來演示一下:一個就是BigDecimal(double val),另一個就是BigDecimal(String str)。

下面是兩個浮點數相減的例子來說明:
public static void main(String[] args) {
double a = 1;
double b = 0.9;
BigDecimal a1 = new BigDecimal(Double.toString(a));
BigDecimal b1 = new BigDecimal(Double.toString(b));
BigDecimal a2 = new BigDecimal(a);
BigDecimal b2 = new BigDecimal(b);
double c = a1.subtract(b1).doubleValue();
double d = a2.subtract(b2).doubleValue();
System.out.println(“c=”+c);
System.out.println(“d=”+d);
}

結果為:
c=0.1
d=0.09999999999999998

可以得出結論:

利用double作為引數的建構函式,無法精確構造一個BigDecimal物件,需要自己指定一個上下文的環境,也就是指定精確位。而利用String物件作為引數傳入的建構函式能精確的構造出一個BigDecimal物件。

之注:附上所有運演算法則的API

加 a1.add(b1).doubleValue();   //即是 a1+b1

減 a1.subtract(b1).doubleValue() //即是a1-b1

乘 a1.multiply(b1).doubleValue() //即是a1*b1

除 a1.divide(b1).doubleValue()  //即是a1/b1