Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變量double可以處理16位內有效數,超過16位,double可能會出現內存溢出。
導入包:
import java.math.BigDecimal;
1.初始化:
創建一個數值為0的BigDecimal
BigDecimal YSJE = BigDecimal.ZERO; BigDecimal SUM = new BigDecimal(0);
創建一個數值不為0的BigDecimal
BigDecimal SUM = new BigDecimal(10.00);
2.運算
SUM = SUM.add(YSJE);//加 String TAX ="10.00"; SUM = SUM.subtract(new BigDecimal(TAX));//減
add(BigDecimal) BigDecimal對象中的值相加,然后返回這個對象。
subtract(BigDecimal) BigDecimal對象中的值相減,然后返回這個對象。
multiply(BigDecimal) BigDecimal對象中的值相乘,然后返回這個對象。
divide(BigDecimal) BigDecimal對象中的值相除,然后返回這個對象。
toString() 將BigDecimal對象的數值轉換成字符串。
doubleValue() 將BigDecimal對象中的值以雙精度數返回。
floatValue() 將BigDecimal對象中的值以單精度數返回。
longValue() 將BigDecimal對象中的值以長整數返回。
intValue() 將BigDecimal對象中的值以整數返回。
3.做除數時需要給divide設置精確的小數點
通過BigDecimal的divide方法進行除法時當不整除,出現無限循環小數時,就會拋異常的,異常如下:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source)
解決之道:就是給divide設置精確的小數點divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)
4.格式化小數點
BigDecimal.setScale()方法用於格式化小數點
setScale(1)表示保留一位小數,默認用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接刪除多余的小數位,如2.35會變成2.3
setScale(1,BigDecimal.ROUND_UP)進位處理,2.35變成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35變成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35變成2.3,如果是5則向下舍