淺談Java中BigDecimal類的簡(jiǎn)單應(yīng)用
一、BigDecimal 類簡(jiǎn)介
因?yàn)橛?jì)算機(jī)無(wú)法精確表示浮點(diǎn)數(shù),所以在進(jìn)行數(shù)字運(yùn)算時(shí),如果有 double 或 float 類型的浮點(diǎn)數(shù)參與計(jì)算,容易出現(xiàn)計(jì)算不準(zhǔn)確的情況。在一些對(duì)精度要求很高的系統(tǒng)中,需要使用 BigDecimal 類來(lái)進(jìn)行精確運(yùn)行。
二、創(chuàng)建 BigDecimal 對(duì)象的方式
2.1 使用構(gòu)造方法創(chuàng)建對(duì)象
使用構(gòu)造器方法創(chuàng)建對(duì)象,有多種不同的入?yún)?,常見的方法如下?/p>
- BigDecimal(String val)
- BigDecimal(double val) (備注:不推薦,容易丟精度)
2.2 使用靜態(tài)方法創(chuàng)建對(duì)象
BigDecimal 有多種靜態(tài)方法可以創(chuàng)建對(duì)象,常見的幾種方法如下所示:
- 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 幾種常見計(jì)算方法如下所示。
操作方法 | 函數(shù) |
加法 | public BigDecimal add(BigDecimal augend) |
減法 | public BigDecimal subtract(BigDecimal subtrahend) |
乘法 | public BigDecimal multiply(BigDecimal multiplicand) |
除法(限定能除盡的情況,如果除不盡會(huì)拋出異常java.lang.ArithmeticException) | public BigDecimal divide(BigDecimal divisor) |
除法(可設(shè)置相除結(jié)果保留精度,無(wú)論是否可以除盡,都可以用該方法設(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è)置格式
可以通過(guò) 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) 方法來(lái)設(shè)置精度,其中傳入?yún)?shù)即保留的小數(shù)位數(shù)。該方法要求請(qǐng)求的操作具有精確的結(jié)果,否則會(huì)拋出 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) 方法
通過(guò)調(diào)用 BigDecimal 的 setScale(int newScale, int roundingMode) 方法,傳入保留的小數(shù)位數(shù) newScale 以及舍入模式 roundingMode(Java BigDecimal 的舍入模式(RoundingMode)詳解),可以實(shí)現(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類的簡(jiǎn)單應(yīng)用的文章就介紹到這了,更多相關(guān)Java的BigDecimal類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud Config對(duì)特殊字符加密處理的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Cloud Config對(duì)特殊字符加密處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-05-05使用MyBatis-Generator如何自動(dòng)生成映射文件
這篇文章主要介紹了使用MyBatis-Generator如何自動(dòng)生成映射文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java單元測(cè)試Powermockito和Mockito使用總結(jié)
公司單元測(cè)試框架選用了Junit 4.12,Mock框架選用了Mockito和PowerMock,本文主要介紹了Java單元測(cè)試Powermockito和Mockito使用總結(jié),感興趣的可以了解一下2021-09-09關(guān)于JVM默認(rèn)堆內(nèi)存大小問題
這篇文章主要介紹了關(guān)于JVM默認(rèn)堆內(nèi)存大小問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02解決eclipse啟動(dòng)tomcat時(shí)不能加載web項(xiàng)目的問題
這篇文章主要介紹了解決eclipse啟動(dòng)tomcat時(shí)不能加載web項(xiàng)目的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06