日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java BigDecimal使用及基本運算(推薦)

瀏覽:42日期:2022-08-25 18:45:14

BigDecimal簡介

Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變量double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是工程計算,在商業計算中要用java.math.BigDecimal。BigDecimal所創建的是對象,我們不能使用傳統的+、-、*、/等算術運算符直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是BigDecimal的對象。構造器是類的特殊方法,專門用來創建對象,特別是帶有參數的對象。

提起BigDecimal,相信大家都使用過,之所以總結這篇呢,是因為最近發現項目中使用的不是太規范,在某些場景下甚至出現代碼拋出異常的情況,

所以就總結了這篇,希望大家在使用時,可以少踩一些坑。

1. 基本運算

1.1 加法

BigDecimal number1 = new BigDecimal('88.88');BigDecimal number2 = new BigDecimal('11.12');BigDecimal number3 = number1.add(number2);System.out.println('number1 add number2 = ' + number3);

輸出結果:

number1 add number2 = 100.00

1.2 減法

BigDecimal number1 = new BigDecimal('88.88');BigDecimal number2 = new BigDecimal('11.12');BigDecimal number3 = number1.subtract(number2);System.out.println('number1 subtract number2 = ' + number3);

輸出結果:

number1 subtract number2 = 77.76

1.3 乘法

BigDecimal number1 = new BigDecimal('88.88');BigDecimal number2 = new BigDecimal('11.12');BigDecimal number3 = number1.multiply(number2);System.out.println('number1 multiply number2 = ' + number3);

輸出結果:

number1 multiply number2 = 988.3456

1.4 除法

BigDecimal number1 = new BigDecimal('88');BigDecimal number2 = new BigDecimal('11');BigDecimal number3 = number1.divide(number2);System.out.println('number1 divide number2 = ' + number3);

輸出結果:

number1 divide number2 = 8

因為上面2個數可以整除,所以這么用沒有問題,不過一但不能被整除,這么用就會有潛在的風險,會拋出java.lang.ArithmeticException異常,所以強烈建議像下面這樣使用

BigDecimal number1 = new BigDecimal('88.88');BigDecimal number2 = new BigDecimal('11.12');BigDecimal number3 = number1.divide(number2, 2, RoundingMode.HALF_UP);System.out.println('number1 divide number2 = ' + number3);

輸出結果:

number1 divide number2 = 7.99

此時使用的divide()方法源碼如下所示:

public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) { return divide(divisor, scale, roundingMode.oldMode);}

這里的scale指的是要保留的小數位數,我們傳的是2,即保留2位小數。

這里的roundingMode指的是舍入模式,我們這里傳的是RoundingMode.HALF_UP,即經常使用的四舍五入模式。

1.5 保留小數位數

如果我們想對BigDecimal類型保留小數位數,可以使用setScale()方法,使用方法如下所示:

BigDecimal number1 = new BigDecimal('88.88');BigDecimal number2 = new BigDecimal('11.12');BigDecimal number3 = number1.multiply(number2);System.out.println('number1 multiply number2 = ' + number3);// 保留3位小數,四舍五入BigDecimal number4 = number3.setScale(3, RoundingMode.HALF_UP);System.out.println('number3 setScale = ' + number4);

輸出結果:

number1 multiply number2 = 988.3456

number3 setScale = 988.346

1.6 比較大小

BigDecimal比較大小,可以使用compareTo()方法,使用方法如下所示:

BigDecimal number1 = new BigDecimal('88.88');BigDecimal number2 = new BigDecimal('11.11');BigDecimal number3 = new BigDecimal('99.99');BigDecimal number4 = new BigDecimal('88.88');System.out.println('number1 compareTo number2 = ' + number1.compareTo(number2));System.out.println('number1 compareTo number3 = ' + number1.compareTo(number3));System.out.println('number1 compareTo number4 = ' + number1.compareTo(number4));

輸出結果:

number1 compareTo number2 = 1

number1 compareTo number3 = -1

number1 compareTo number4 = 0

由輸出結果可以看出:

當number1小于number2時,返回-1,

當number1等于number2時,返回0,

當number1大于number2時,返回1。

2. 踩坑總結

2.1 NullPointerException異常

在使用BigDecimal類型進行計算時,比如上面提到的加、減、乘、除、比較大小時,一定要保證參與計算的兩個值不能為空,否則會拋出java.lang.NullPointerException異常。

比如下面的2段代碼,都會拋出異常:

BigDecimal number1 = null;BigDecimal number2 = new BigDecimal('11.12');BigDecimal number3 = number1.add(number2);System.out.println('number1 add number2 = ' + number3);

BigDecimal number1 = new BigDecimal('88.88');BigDecimal number2 = null;BigDecimal number3 = number1.add(number2);System.out.println('number1 add number2 = ' + number3);

拋出的異常如下圖所示:

Java BigDecimal使用及基本運算(推薦)

2.2 ArithmeticException異常

一次在使用BigDecimal的divide方法時,拋出java.lang.ArithmeticException異常,錯誤代碼如下所示:

// 含稅金額BigDecimal inclusiveTaxAmount = new BigDecimal('1000');// 稅率BigDecimal taxRate = new BigDecimal('0.13');// 不含稅金額 = 含稅金額 / (1+稅率)BigDecimal exclusiveTaxAmount = inclusiveTaxAmount.divide(BigDecimal.ONE.add(taxRate));System.out.println(exclusiveTaxAmount);

運行時拋出以下異常:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

Java BigDecimal使用及基本運算(推薦)

報錯原因是因為無法整除,導致結果是無限循環小數:

Java BigDecimal使用及基本運算(推薦)

解決方案是指定下舍入模式,比如我們最常用的四舍五入模式:

// 不含稅金額 = 含稅金額 / (1+稅率)BigDecimal exclusiveTaxAmount = inclusiveTaxAmount.divide(BigDecimal.ONE.add(taxRate),RoundingMode.HALF_UP);

此時不再報錯,輸出結果為:

885

但這里我的需求是保留2位小數,四舍五入,因此代碼應該是下面這樣的:

// 不含稅金額 = 含稅金額 / (1+稅率)BigDecimal exclusiveTaxAmount = inclusiveTaxAmount.divide(BigDecimal.ONE.add(taxRate), 2, RoundingMode.HALF_UP);

此時的輸出結果為:

884.96

如果你的IDEA裝了阿里巴巴代碼規范插件,如果不指定RoundingMode,會有下面這樣的提示:

Java BigDecimal使用及基本運算(推薦)

3. 使用規范

盡量不要在項目中使用new BigDecimal('0'),而是使用BigDecimal提供的常量BigDecimal.ZERO。

BigDecimal zero = BigDecimal.ZERO;BigDecimal one = BigDecimal.ONE;BigDecimal ten = BigDecimal.TEN;

總結

到此這篇關于Java BigDecimal使用指南針(推薦)的文章就介紹到這了,更多相關Java BigDecimal使用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线亚洲成人| 精品一区视频| 红桃视频国产一区| 久久三级福利| 国产美女亚洲精品7777| 欧洲激情综合| 伊人久久亚洲影院| 香蕉成人久久| 亚洲影视一区二区三区| 日韩av不卡一区二区| 国产日产一区| 精品国产黄a∨片高清在线| 在线看片国产福利你懂的| 精品美女在线视频| 国产伊人精品| 欧美一级鲁丝片| 国产va免费精品观看精品视频| 精品国产aⅴ| 亚洲欧美日韩高清在线| 国产精品亚洲欧美日韩一区在线| 国内精品福利| 日韩一区三区| 成午夜精品一区二区三区软件| 日本欧美一区| 日本综合精品一区| 老司机久久99久久精品播放免费| 色吊丝一区二区| 国产欧美另类| 91视频一区| 久久影院午夜精品| 国产精品2区| 国产精品任我爽爆在线播放| 天堂俺去俺来也www久久婷婷| 午夜久久美女| 亚洲一区欧美激情| 亚洲在线成人| 免费国产亚洲视频| 中文字幕一区二区三区四区久久| 欧美精品黄色| 亚洲精品高潮| 国产欧美69| 高清av一区| 99热精品久久| 午夜亚洲福利在线老司机| 午夜在线精品偷拍| 日韩午夜av| 日本v片在线高清不卡在线观看| 日韩精品福利一区二区三区| 日韩国产精品久久久久久亚洲| 日韩福利视频导航| 久久久久久久久成人| 精品福利久久久| 99国产精品免费视频观看| 91九色精品| 日韩高清中文字幕一区| 午夜一区在线| 日本不卡的三区四区五区| 99re国产精品| 亚洲一区成人| 亚洲二区视频| 日韩国产在线观看| 国产综合色区在线观看| 日本vs亚洲vs韩国一区三区二区| 国语对白精品一区二区| 香蕉久久夜色精品国产| 精品黄色一级片| 亚洲欧美视频| 蜜桃成人精品| 国产欧美日韩亚洲一区二区三区| 伊人精品一区| 成人台湾亚洲精品一区二区| 一区二区国产在线观看| 91青青国产在线观看精品| 日韩综合一区二区三区| 五月综合激情| 国产日产精品_国产精品毛片 | 狂野欧美性猛交xxxx| 在线国产一区二区| 国产一区国产二区国产三区| 亚洲精品无播放器在线播放| 日韩一区二区在线免费| 91成人在线精品视频| 狠狠色综合网| 国产盗摄——sm在线视频| 欧美天堂在线| 亚洲制服一区| 尹人成人综合网| 中文字幕高清在线播放| 国产精品1区| 日韩高清不卡在线| 亚洲少妇自拍| 久久久一二三| 国产精品久久观看| 欧美精品国产白浆久久久久| 天堂成人国产精品一区| 中文在线免费视频| 国产黄色精品| 国产精品毛片久久久| 亚洲三级国产| 一区在线免费| 欧美jjzz| 99精品一区| 国产 日韩 欧美一区| 国产中文欧美日韩在线| 精品中国亚洲| 精品深夜福利视频| 精品久久影院| 美女精品久久| 免费日韩成人| 精品一区av| 国产欧美在线观看免费| 亚洲精品成人一区| 亚洲精品人人| 日韩精品一级中文字幕精品视频免费观看 | 欧美日韩午夜| 日韩一区二区三区精品视频第3页| 免费日韩一区二区| 丝袜美腿亚洲一区| 久久一二三区| 亚洲婷婷丁香| 日韩国产一区二| 国产精品亚洲综合色区韩国| 牛牛精品成人免费视频| 日韩精品视频一区二区三区| 亚洲精品成人一区| 欧美视频精品全部免费观看| 欧美午夜三级| 久久久久97| 欧美www视频在线观看| 国产精品毛片一区二区在线看| 国产成人免费视频网站视频社区| 日韩成人精品一区二区| 日韩中文在线电影| 国内精品福利| 亚洲一区欧美| 国产精品主播| 成人一区而且| 久久精品国语| 久久精品国产99久久| 影院欧美亚洲| 亚洲理论在线| 国产日韩欧美一区在线| 国产一区二区久久久久| 国产精品字幕| 视频在线在亚洲| 久久国产麻豆精品| 高清久久一区| 亚洲激情久久| 日本不卡一区二区三区| 国产极品一区| 成人自拍av| 免费的成人av| 国产精品对白| 国产一区二区三区精品在线观看| 91精品国产乱码久久久久久久| 欧美日韩国产亚洲一区| 日韩精品久久理论片| 精品国产中文字幕第一页| 日本精品不卡| 免费人成精品欧美精品 | 欧美男人天堂| 鲁大师影院一区二区三区| 97se亚洲| 色婷婷精品视频| 亚洲精品美女| 国产乱人伦丫前精品视频| 高清不卡亚洲| 视频一区视频二区在线观看| 你懂的国产精品| 亚洲大全视频| 国产欧美自拍一区| 欧美 日韩 国产一区二区在线视频| 亚洲美女久久| 午夜欧美巨大性欧美巨大| 亚洲精品系列| 欧美成人精品三级网站| 亚洲精品高潮| 国产麻豆久久| 国产麻豆一区二区三区精品视频| 99久久久久国产精品| 日韩av中文字幕一区二区三区| 超碰99在线| 亚州精品视频| 久久精品免费一区二区三区 | 久久超级碰碰| 伊人影院久久| 国产成人精品亚洲线观看| 国产精品美女久久久| 国产成人免费视频网站视频社区| 亚洲一区不卡| 黄色在线网站噜噜噜| 亚洲va久久| 偷拍欧美精品| 国产一区二区三区黄网站| 综合国产视频| 久久人人精品| 国产精品白丝一区二区三区| 亚洲一级影院| 久久久亚洲欧洲日产| 玖玖玖国产精品|