請參考以下的運作程式:
1.使用0.1+0.2時 出現了如下的情況:
這個是沒有BigDecimal的情況 0.1 + 0.2 =0.30000000000000004。
因為計算機是二進制的,對于double,float類型的10進制資料,通常是無法使用二進制進行精确表示的,是以就會出現這種情況,在實際的生活應用中,我們的計算題程式中,金融業的程式中,是不允許出現這種情況的,是以要使用BigDecimal去處理這種問題。
BigDecial是一種用于處理十六位以上的資料的java.lang.math包裡的API,浮點型資料double可以用于處理十六位的有效資料,需要對更大或者更小的數進行運算和處理。float和double隻能能用來做科學計算或者是工程計算(因為會出現類似如上的問題)因為這是一種對象,一個數就是一個對象,是以我們不可以和普通的類型一樣去加減乘除 + - * /這樣去對資料進行計算,具體的實作需要通過調用它的方法去完成一系列的計算。
BigDecimal(int)
BigDecimal(double) //不建議使用
BigDecimal(long)
BigDecimal(String) //推薦使用‘
add(Bigdecimal) 加法
subtract(BigDecimal) 減法
multiply(BigDecimal) 乘法
devide(BigDecimal) 除法 當出現無法除盡的時候 就會報錯 如下:ava.lang.ArithmeticException 是以要使用下面的方法:
devide(BigDecimal divisor, int scale, RoundingMode roundingMode)。
因為這個方法無法做到精确 :

運作得到的效果如下:
可以看到無法精确的得到0.1這個資料 ?為什麼呢?
1、參數類型為double的構造方法的結果有一定的不可預知性。有人可能認為在Java中寫入newBigDecimal(0.1)所建立的BigDecimal正好等于 0.1(非标度值 1,其标度為 1),但是它實際上等于0.1000000000000000055511151231257827021181583404541015625。這是因為0.1無法準确地表示為 double(或者說對于該情況,不能表示為任何有限長度的二進制小數)。這樣,傳入到構造方法的值不會正好等于 0.1(雖然表面上等于該值)。
2、另一方面,String 構造方法是完全可預知的:寫入 newBigDecimal("0.1") 将建立一個 BigDecimal,它正好等于預期的 0.1。是以,比較而言,通常建議優先使用String構造方法