淺談Java中BigDecimal類的簡單應用
一、BigDecimal 類簡介
因為計算機無法精確表示浮點數(shù),所以在進行數(shù)字運算時,如果有 double 或 float 類型的浮點數(shù)參與計算,容易出現(xiàn)計算不準確的情況。在一些對精度要求很高的系統(tǒng)中,需要使用 BigDecimal 類來進行精確運行。
二、創(chuàng)建 BigDecimal 對象的方式
2.1 使用構(gòu)造方法創(chuàng)建對象
使用構(gòu)造器方法創(chuàng)建對象,有多種不同的入?yún)?,常見的方法如下?/p>
- BigDecimal(String val)
- BigDecimal(double val) (備注:不推薦,容易丟精度)
2.2 使用靜態(tài)方法創(chuàng)建對象
BigDecimal 有多種靜態(tài)方法可以創(chuàng)建對象,常見的幾種方法如下所示:
- public static BigDecimal valueOf(double val)
- public static BigDecimal valueOf(long val)
- public static BigDecimal valueOf(long unscaledVal, int scale)
以上幾種創(chuàng)建 BigDecimal 的 demo 如下所示。
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("123.092");
System.out.println(num1);
// 123.092
// 不推薦此種方法
BigDecimal num2 = new BigDecimal(123.092);
System.out.println(num2);
// 123.0919999999999987494447850622236728668212890625
BigDecimal num3 = BigDecimal.valueOf(1234.5678);
System.out.println(num3);
// 1234.5678
long num4 = 1234;
BigDecimal num5 = BigDecimal.valueOf(num4);
System.out.println(num5);
// 1234
BigDecimal num6 = BigDecimal.valueOf(num4, 3);
System.out.println(num6);
// 1.234
}三、BigDecimal 類的常用方法
BigDecimal 幾種常見計算方法如下所示。
| 操作方法 | 函數(shù) |
| 加法 | public BigDecimal add(BigDecimal augend) |
| 減法 | public BigDecimal subtract(BigDecimal subtrahend) |
| 乘法 | public BigDecimal multiply(BigDecimal multiplicand) |
| 除法(限定能除盡的情況,如果除不盡會拋出異常java.lang.ArithmeticException) | public BigDecimal divide(BigDecimal divisor) |
| 除法(可設(shè)置相除結(jié)果保留精度,無論是否可以除盡,都可以用該方法設(shè)置精度) | public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) |
| 求余 | public BigDecimal remainder(BigDecimal divisor) |
| 求相反數(shù) | public BigDecimal negate() |
以上幾種操作方法的 demo 如下所示。
四、設(shè)置精度(保留小數(shù)位)
BigDecimal 有多種方法可以設(shè)置精度(即設(shè)置幾位小數(shù))。分述如下。
4.1 DecimalFormat 設(shè)置格式
可以通過 DecimalFormat 設(shè)置保留的格式,demo 如下所示。如何編寫 DecimalFormat,可以參考網(wǎng)上的介紹,此處不做介紹。
public static void main(String[] args) {
// 格式化兩位有效數(shù)字(四舍五入)
DecimalFormat df = new DecimalFormat("0.00");
double num1 = 0.145926;
System.out.println(df.format(num1));
// 0.15
}4.2 BigDecimal setScale(int newScale) 方法設(shè)置精度
可以調(diào)用 BigDecimal 的 setScale(int newScale) 方法來設(shè)置精度,其中傳入?yún)?shù)即保留的小數(shù)位數(shù)。該方法要求請求的操作具有精確的結(jié)果,否則會拋出 ArithmeticException。
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("1234");
BigDecimal num2 = num1.setScale(1);
System.out.println(num2);
// 1234.0
BigDecimal num3 = new BigDecimal("1234.45");
BigDecimal num4 = num3.setScale(1);
System.out.println(num4);
// 此處拋出異常:java.lang.ArithmeticException: Rounding necessary
}4.3 調(diào)用 BigDecimal 的 setScale(int newScale, int roundingMode) 方法
通過調(diào)用 BigDecimal 的 setScale(int newScale, int roundingMode) 方法,傳入保留的小數(shù)位數(shù) newScale 以及舍入模式 roundingMode(Java BigDecimal 的舍入模式(RoundingMode)詳解),可以實現(xiàn)精度設(shè)置,demo 如下所示。
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("1234.455");
BigDecimal num2 = num1.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(num2);
// 1234.46
System.out.println(num2.doubleValue());
// 1234.46
}五、常用乘除法(設(shè)置精度)
5.1 乘法
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("1.45");
BigDecimal num2 = new BigDecimal("2.625");
BigDecimal ans = num1.multiply(num2).setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(ans);
// 3.81
System.out.println(ans.doubleValue());
// 3.81
System.out.println(ans.intValue());
// 3
}5.2 除法
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("10.45");
BigDecimal num2 = new BigDecimal("2.625");
BigDecimal ans = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
System.out.println(ans);
// 3.98
System.out.println(ans.doubleValue());
// 3.98
System.out.println(ans.intValue());
// 3
}到此這篇關(guān)于淺談Java中BigDecimal類的簡單應用的文章就介紹到這了,更多相關(guān)Java的BigDecimal類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud Config對特殊字符加密處理的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Cloud Config對特殊字符加密處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2018-05-05
Java單元測試Powermockito和Mockito使用總結(jié)
公司單元測試框架選用了Junit 4.12,Mock框架選用了Mockito和PowerMock,本文主要介紹了Java單元測試Powermockito和Mockito使用總結(jié),感興趣的可以了解一下2021-09-09
解決eclipse啟動tomcat時不能加載web項目的問題
這篇文章主要介紹了解決eclipse啟動tomcat時不能加載web項目的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

