一、什麼是BigDecimal
在Java中,double和float雖然可以表示小數,但是由於精度限制會出現精度丟失的情況,比如0.1+0.2的結果並不等於0.3,因為這些數字都是浮點數,在計算機內部是以二進位來表示,有些十進位小數用二進位表示會出現無限循環的情況,因此就會導致精度問題。
在這種情況下,我們需要使用BigDecimal來進行精確計算。BigDecimal是位於java.math包中的一個類,它可以表示任意精度的小數,並且不會出現精度丟失的情況。使用BigDecimal進行計算的時候,我們需要精確定義數字的位數和舍入規則。
二、如何使用BigDecimal
使用BigDecimal類時,我們可以使用它的構造方法來創建一個BigDecimal實例,如下所示:
BigDecimal bd = new BigDecimal("0.1");
其中,參數傳入的是一個String類型的數值,這樣可以避免浮點數精度問題。如果我們想要進行精確計算,需要指定數字的位數和舍入規則,可以使用setScale方法和setRound方法進行設置。
例如,我們向將0.1和0.2相加得到0.3,可以先使用setScale方法設定位數,如下所示:
BigDecimal bd1 = new BigDecimal("0.1"); BigDecimal bd2 = new BigDecimal("0.2"); BigDecimal bd3 = bd1.add(bd2).setScale(1, BigDecimal.ROUND_HALF_UP); System.out.println(bd3.toString());
其中setScale方法中,第一個參數是設定精度位數,第二個參數是設定舍入規則,這裡我們使用ROUND_HALF_UP表示四捨五入。最後輸出結果為0.3。
三、BigDecimal的其它方法
除了setScale方法和setRound方法,BigDecimal還提供了其它有用的方法。下面介紹幾個常用的方法:
1. compareTo方法
compareTo方法用來比較兩個BigDecimal對象的大小,返回-1、0、1表示前者小於、等於、大於後者。例如:
BigDecimal bd1 = new BigDecimal("0.1"); BigDecimal bd2 = new BigDecimal("0.2"); System.out.println(bd1.compareTo(bd2)); //-1 System.out.println(bd2.compareTo(bd1)); //1 System.out.println(bd1.compareTo(bd1)); //0
在比較的時候,要注意使用compareTo方法而不是equals方法,因為equals方法只比較值是否相等,不比較精度。
2. divide方法
divide方法用來進行除法運算,可以指定精度和舍入規則。例如:
BigDecimal bd1 = new BigDecimal("10"); BigDecimal bd2 = new BigDecimal("3"); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP); System.out.println(bd3.toString()); //3.33
其中,第一個參數為除數,第二個參數為精度位數,第三個參數為舍入規則。
3. multiply方法
multiply方法用來進行乘法運算,可以指定精度和舍入規則。例如:
BigDecimal bd1 = new BigDecimal("2"); BigDecimal bd2 = new BigDecimal("3"); BigDecimal bd3 = bd1.multiply(bd2); System.out.println(bd3.toString()); //6
其中,第一個參數為乘數,第二個參數為精度位數,第三個參數為舍入規則。
四、總結
使用BigDecimal可以避免浮點數精度丟失的問題,可以實現精確的計算。在使用BigDecimal時,需要注意設定數字的位數和舍入規則,同時還有其它有用的方法可以幫助我們完成高精度計算。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/283505.html