public class BigDecimaldemo1 {public static void main(String[] args) {System.out.println(0.09+0.01);//為什么不是0.10呢?}
}
在使用float或者double類型的數據在進行數學運算的時候,很有可能會產生精度丟失問題。我們都知道計算機底層在進行運算的時候,使用的都是二進制數據; ?
趨近于這個十進數的二進制數據; 這樣使用一個不太準確的數據進行運算的時候, 最終就會造成精度丟失;為了提高精度,Java就給我們提供了BigDecimal供我們進行數據運算。 ?
構造方法?
1.通過傳遞double類型的小數來創建對象
//1.通過傳遞double類型的小數來創建對象BigDecimal bd1 = new BigDecimal(0.01);BigDecimal bd2 = new BigDecimal(0.09);System.out.println(bd1.add(bd2));
2.通過傳遞字符串表示的小數來創建對象
//2.通過傳遞字符串表示的小數來創建對象BigDecimal bd3=new BigDecimal("3.14");BigDecimal bd4=new BigDecimal("1.11");System.out.println(bd3.add(bd4));
3.通過靜態方法來獲取對象
BigDecimal bd5=BigDecimal.valueOf(10.0);BigDecimal bd6=BigDecimal.valueOf(10.0);System.out.println(bd5==bd6);
常見成員方法
public BigDecimal add(BigDecimal value)?? ??? ??? ??? ?// 加法運算
public BigDecimal subtract(BigDecimal value)?? ??? ?// 減法運算
public BigDecimal multiply(BigDecimal value)?? ??? ?// 乘法運算
public BigDecimal divide(BigDecimal value)?? ??? ??? ?// 觸發運算
?
public class BigDecimalDemo01 {public static void main(String[] args) {// 創建兩個BigDecimal對象BigDecimal b1 = new BigDecimal("0.3") ;BigDecimal b2 = new BigDecimal("4") ;// 調用方法進行b1和b2的四則運算,并將其運算結果在控制臺進行輸出System.out.println(b1.add(b2)); // 進行加法運算System.out.println(b1.subtract(b2)); // 進行減法運算System.out.println(b1.multiply(b2)); // 進行乘法運算System.out.println(b1.divide(b2)); // 進行除法運算}}
運行程序進行測試,控制臺輸出結果如下:
4.3
-3.7
1.2
0.075
如果使用BigDecimal類型的數據進行除法運算的時候,得到的結果是一個無限循環小數,那么就會報錯:ArithmeticException。 如下代碼所示:
public class BigDecimalDemo02 {public static void main(String[] args) {// 創建兩個BigDecimal對象BigDecimal b1 = new BigDecimal("1") ;BigDecimal b2 = new BigDecimal("3") ;// 調用方法進行b1和b2的除法運算,并且將計算結果在控制臺進行輸出System.out.println(b1.divide(b2));}}
運行程序進行測試,控制臺輸出結果如下所示:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
?
針對這個問題怎么解決,此時我們就需要使用到BigDecimal類中另外一個divide方法,如下所示:
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
上述divide方法參數說明:
divisor:?? ??? ??? ?除數對應的BigDecimal對象;
scale:?? ??? ??? ??? ?精確的位數;
roundingMode:?? ??? ?取舍模式;
取舍模式被封裝到了RoundingMode這個枚舉類中(關于枚舉我們后期再做重點講解),在這個枚舉類中定義了很多種取舍方式。最常見的取舍方式有如下幾個:
UP(直接進1) , FLOOR(直接刪除) , HALF_UP(4舍五入),我們可以通過如下格式直接訪問這些取舍模式:枚舉類名.變量名
public class BigDecimaldemo2 {public static void main(String[] args) {// 演示取舍模式HALF_UP// 創建兩個BigDecimal對象BigDecimal b1 = new BigDecimal("0.95") ;BigDecimal b2 = new BigDecimal("3") ;System.out.println(b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP));}
}
?
?
?