淺談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) |
除法(可設置相除結(jié)果保留精度,無論是否可以除盡,都可以用該方法設置精度) | public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) |
求余 | public BigDecimal remainder(BigDecimal divisor) |
求相反數(shù) | public BigDecimal negate() |
以上幾種操作方法的 demo 如下所示。
四、設置精度(保留小數(shù)位)
BigDecimal 有多種方法可以設置精度(即設置幾位小數(shù))。分述如下。
4.1 DecimalFormat 設置格式
可以通過 DecimalFormat 設置保留的格式,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) 方法設置精度
可以調(diào)用 BigDecimal 的 setScale(int newScale) 方法來設置精度,其中傳入?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)精度設置,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 }
五、常用乘除法(設置精度)
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-05Java單元測試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