double和float計算精度不許的問題

一、首先咱們要知道float和double型,的底層實現是二進制的。十進制中的一個有限位數小數,轉換成二進制就不必定是有限位數了,一旦位數超過的float和double型的位數寬度,就會出現「精度溢出」。因此float和double型是爲了科學計算而設計的,並不適合精確的十進制計算. ide

   例子: 就像一個十進制的小數,要不斷地乘以2取整,但在這個過程當中可能會一直循環下去,這就形成了數據的不精確。 函數

因此在必需要求數據的精確度時,不能使用float和double. spa

public class Test{設計

public static void main(String[] args)orm

{對象

System.out.println(0.05+0.01);ci

System.out.println(1.0-0.42);it

System.out.println(4.015*100);class

System.out.println(123.3/100);循環

}

}

輸出結果爲:

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中還有不少相關的數值之間的計算方法,以及精確到的位數和四捨五入等。


注意: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對象。

相關文章
相關標籤/搜索