Java使用BigDecimal公式精確計算及精度丟失問題
一、Java使用BigDecimal公式計算(精確計算)
介紹:
使用BigDecimal加減乘除方法運算,可以使用BigDecimal類提供的add、subtract、multiply、divide方法函數(shù)實現(xiàn)。
公式加法計算~add
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
//BigDecimal計算add
BigDecimal addResult = a.add(b);
System.out.println("結果集: " +addResult);
}結果集:

公式減法計算~subtract
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
BigDecimal計算subtract
BigDecimal subtract = a.subtract(b);
System.out.println("結果集subtract: " +subtract);
}結果集:

公式乘法計算~multiply
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
BigDecimal計算multiply
BigDecimal multiply = a.multiply(b);
System.out.println("結果集: " +multiply);
}結果集:

公式除法計算~divide
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
//BigDecimal計算divide
//ROUND_HALF_UP:向“最接近的”整數(shù)舍入。 若舍入位大于等于5,則對舍入部分的前一位數(shù)字加1;若舍入位小于5,則直接舍棄。即為四舍五入模式。
BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留兩位小數(shù).
System.out.println("結果集: " +divide);
}結果集:

二、 BigDecimal(舍入模式)選擇
簡介:
BigDecimal.setScale主要用于對BigDecimal數(shù)據(jù)小數(shù)點后的位數(shù)進行 進位、舍位、截斷等操作
java.math.RoundingMode:這是一種枚舉類型,它定義了8種數(shù)據(jù)的舍入模式。它與java.math.BigDecimal類中定義的8個同名靜態(tài)常量的作用相同,可用BigDecimal.setScale(int newScale, RoundingMode roundingMode)來設置數(shù)據(jù)的精度和舍入模式。
1、ROUND_UP:向遠離零的方向舍入。
若舍入位為非零,則對舍入部分的前一位數(shù)字加1;若舍入位為零,則直接舍棄。即為向外取整模式。
2、ROUND_DOWN:向接近零的方向舍入。
不論舍入位是否為零,都直接舍棄。即為向內取整模式。
3、ROUND_CEILING:向正無窮大的方向舍入。
若 BigDecimal 為正,則舍入行為與 ROUND_UP 相同;若為負,則舍入行為與 ROUND_DOWN 相同。即為向上取整模式。
4、ROUND_FLOOR:向負無窮大的方向舍入。
若 BigDecimal 為正,則舍入行為與 ROUND_DOWN 相同;若為負,則舍入行為與 ROUND_UP 相同。即為向下取整模式。
5、ROUND_HALF_UP:向“最接近的”整數(shù)舍入。
若舍入位大于等于5,則對舍入部分的前一位數(shù)字加1;若舍入位小于5,則直接舍棄。即為四舍五入模式。
6、ROUND_HALF_DOWN:向“最接近的”整數(shù)舍入。
若舍入位大于5,則對舍入部分的前一位數(shù)字加1;若舍入位小于等于5,則直接舍棄。即為五舍六入模式。
7、ROUND_HALF_EVEN:向“最接近的”整數(shù)舍入。
若(舍入位大于5)或者(舍入位等于5且前一位為奇數(shù)),則對舍入部分的前一位數(shù)字加1;
若(舍入位小于5)或者(舍入位等于5且前一位為偶數(shù)),則直接舍棄。即為銀行家舍入模式。
8、ROUND_UNNECESSARY
斷言請求的操作具有精確的結果,因此不需要舍入。
如果對獲得精確結果的操作指定此舍入模式,則拋出ArithmeticException。
案例:
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
//BigDecimal計算divide
//ROUND_HALF_UP:向“最接近的”整數(shù)舍入。 若舍入位大于等于5,則對舍入部分的前一位數(shù)字加1;若舍入位小于5,則直接舍棄。即為四舍五入模式。
//ROUND_UP:向遠離零的方向舍入。 若舍入位為非零,則對舍入部分的前一位數(shù)字加1;若舍入位為零,則直接舍棄。即為向外取整模式。
BigDecimal divide = a.divide(b,BigDecimal.ROUND_HALF_UP, 2).setScale(2,ROUND_UP);
System.out.println("結果集: " +divide);
}結果集:

計算器結果集如下圖:

三、 BigDecimal.setScale用法案例
BigDecimal.setScale主要用于對BigDecimal數(shù)據(jù)小數(shù)點后的位數(shù)進行 進位、舍位、截斷等操作
public static void main(String[] args){
BigDecimal a = BigDecimal.valueOf(5.6);
BigDecimal b = BigDecimal.valueOf(2.1);
//BigDecimal計算divide
BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_UP).setScale(2, BigDecimal.ROUND_UP);
System.out.println("結果集: " +divide);
}結果集:

四、Java使用BigDecimal精度丟失問題
介紹:
在實際應用中,經常會使用到計算,舉例如 '銀行' 特別是在我們交易的時候,計算結果要求的更加精確,這個時候我們就會使用到java.math包中提供的API類BigDecimal,用于對超過16位有效位數(shù)的數(shù)字進行精確的計算。
以如下代碼為例:
public static void main(String[] args){
System.out.println("使用bigDecimal進行轉換"+new BigDecimal(234.567));
}運行后結果集出現(xiàn)精度丟失:

結果可以看出使用new BigDecimal(234.567),傳入?yún)?shù)為double類型發(fā)生精度丟失,運行的結果并不等于234.567,而是為234.5670000000000072759576141834259033203125。
原因是double不能表示為任何有限長度的二進制小數(shù);
解決方法: 使用new BigDecimal(String)構造函數(shù),創(chuàng)建一個參數(shù)以字符串表示數(shù)值的對象
public static void main(String[] args){
double a = 234.567;
String b = "234.567";
// 方式一:double的封裝類Double中的toString()方法解決
System.out.println("使用bigDecimal進行轉換" + new BigDecimal(new Double(a).toString()));
// 方式二:使用String接收數(shù)值
System.out.println("使用bigDecimal進行轉換" + new BigDecimal(b));
}結果集如下:

如需使用加減乘除方法運算,可以使用BigDecimal類提供的add、subtract、multiply、divide方法實現(xiàn) 如上:Java使用BigDecimal公式計算。
總結
到此這篇關于Java使用BigDecimal公式精確計算及精度丟失問題的文章就介紹到這了,更多相關Java使用BigDecimal公式精確計算內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Postman實現(xiàn)傳List<String>集合
這篇文章主要介紹了Postman實現(xiàn)傳List<String>集合方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

