淺談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)ⅲR?jiàn)的方法如下:
- BigDecimal(String val)
- BigDecimal(double val) (備注:不推薦,容易丟精度)
2.2 使用靜態(tài)方法創(chuàng)建對(duì)象
BigDecimal 有多種靜態(tài)方法可以創(chuàng)建對(duì)象,常見(jiàn)的幾種方法如下所示:
- 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 幾種常見(jiàn)計(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 如下所示。如何編寫(xiě) 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)文章
深入理解Java并發(fā)編程之LinkedBlockingQueue隊(duì)列
本文主要介紹了Java并發(fā)編程之LinkedBlockingQueue隊(duì)列,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
SpringBoot項(xiàng)目啟動(dòng)報(bào)錯(cuò)"找不到或無(wú)法加載主類"的解決方法
在使用 IntelliJ IDEA 開(kāi)發(fā)基于 Spring Boot 框架的 Java 程序時(shí),可能會(huì)出現(xiàn)找不到或無(wú)法加載主類 com.example.springboot.SpringbootApplication的錯(cuò)誤提示,下面我們來(lái)看看如何解決吧2025-03-03
一文掌握J(rèn)ava 數(shù)據(jù)結(jié)構(gòu)超詳細(xì)筆記(收藏版)
本文給大家介紹Java數(shù)據(jù)結(jié)構(gòu),包括數(shù)組、鏈表、List、Set、Map及迭代器,對(duì)比了其內(nèi)存特性、操作效率和應(yīng)用場(chǎng)景,并介紹了哈希及沖突解決方法,感興趣的朋友跟隨小編一起看看吧2025-09-09
springdata jpa單表操作crud的實(shí)例代碼詳解
這篇文章主要介紹了springdata jpa單表操作crud的實(shí)例代碼詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Java設(shè)計(jì)模式模板方法模式(Template)用法解析
這篇文章主要介紹了Java設(shè)計(jì)模式模板方法模式(Template)用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list
這篇文章主要介紹了java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12
Idea設(shè)置全局highlighting?level為Syntax問(wèn)題
這篇文章主要介紹了Idea設(shè)置全局highlighting?level為Syntax問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

