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

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

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

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

BigDecimal簡介

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

提起B(yǎng)igDecimal,相信大家都使用過,之所以總結這篇呢,是因為最近發(fā)現(xiàn)項目中使用的不是太規(guī)范,在某些場景下甚至出現(xiàn)代碼拋出異常的情況,

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

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使用及基本運算(推薦)

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

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裝了阿里巴巴代碼規(guī)范插件,如果不指定RoundingMode,會有下面這樣的提示:

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

3. 使用規(guī)范

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

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

總結

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆精品久久| 日本va欧美va精品| 国产黄色一区| 国产欧美二区| 久久av国产紧身裤| 精品视频在线一区二区在线| 久久精品国产网站| 国产一区91| 亚洲精品综合| 国产欧美一区二区三区精品观看 | 福利在线一区| 欧美sss在线视频| 欧美一区=区三区| 丝瓜av网站精品一区二区| 久久99性xxx老妇胖精品| 欧美一区二区三区激情视频 | 亚洲电影在线| 麻豆成人综合网| 综合色就爱涩涩涩综合婷婷| 日韩免费精品| 久久精品三级| 国产亚洲欧美日韩在线观看一区二区| 欧美一区91| 久久亚洲道色| 久久久久中文| 一区二区自拍| 日本成人在线不卡视频| 国产精品视频一区视频二区| 日韩av免费大片| 日韩一级网站| 国产日产一区| 91tv亚洲精品香蕉国产一区| 亚洲一区二区日韩| 国产欧美综合一区二区三区| 久久一区精品| 欧美日韩国产传媒| 婷婷综合国产| 亚洲精品永久免费视频| 另类激情亚洲| 欧美激情视频一区二区三区在线播放| 99久久久久久中文字幕一区| 美国三级日本三级久久99| 国产精品成人国产| 久久精品国产99久久| 日韩激情一区二区| 超碰超碰人人人人精品| 另类激情亚洲| 成人精品久久| 四虎精品一区二区免费| 日韩成人精品一区二区| 免费成人在线观看| 国产一区二区三区四区五区| 麻豆亚洲精品| 成人在线免费观看网站| 亚洲欧美日韩综合国产aⅴ| 国产极品久久久久久久久波多结野| 亚洲午夜一级| 久久av网站| 一区二区三区四区日韩| 福利视频一区| 日韩欧美激情电影| 欧美亚洲在线日韩| 国产精品久久国产愉拍| 99热精品在线| 国产精品久久观看| 日韩欧美中文在线观看| 久久国产成人午夜av影院宅| 国产三级精品三级在线观看国产| 好看的av在线不卡观看| 成人国产精选| 欧美一区二区三区免费看| 不卡一区2区| 国产一区精品福利| 日本午夜精品久久久久| 红桃视频国产精品| 精品九九久久| 日韩三级精品| 亚洲激情社区| 免费高潮视频95在线观看网站| 国产欧美成人| 香蕉久久夜色精品国产| 国产在线|日韩| 麻豆一区二区三区| 亚洲丝袜啪啪| 黄色不卡一区| 成人片免费看| 麻豆视频久久| 日本国产欧美| 国产精品毛片一区二区三区| 另类中文字幕国产精品| 精品中文字幕一区二区三区| 亚洲精品麻豆| 午夜在线精品| re久久精品视频| 91精品国产成人观看| 国产精品qvod| 日本va欧美va欧美va精品| 亚洲综合不卡| 亚洲精品国产偷自在线观看| 国产欧洲在线| 欧美交a欧美精品喷水| 成人午夜国产| 国产精品激情| 日韩精品91亚洲二区在线观看| 亚洲一区区二区| 99久久精品费精品国产| 日本不卡免费高清视频在线| 精品国产99| 精品亚洲免a| 久久亚洲道色| 日韩黄色在线观看| 亚洲3区在线| 欧美一级专区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲午夜黄色| 99久久亚洲精品蜜臀| 91精品推荐| 久久精品亚洲欧美日韩精品中文字幕| 韩国久久久久久| 麻豆国产在线| sm久久捆绑调教精品一区| 国内在线观看一区二区三区 | 久久国产精品毛片| 欧美91视频| 午夜精品一区二区三区国产| 九九综合九九| 夜夜嗨一区二区| 免费观看在线综合色| 亚洲免费资源| 日本午夜精品一区二区三区电影 | 天堂va蜜桃一区二区三区| 久久免费高清| 国产一区亚洲| 久久免费高清| 精品一区欧美| 免费日韩av片| 日韩精品国产欧美| 国产精品亚洲综合色区韩国| 国产精品地址| 国产一区日韩| 成人精品亚洲| 激情欧美国产欧美| 久久国产高清| 日韩影片在线观看| 国产精品一区高清| 国产成人精选| 国产高清一区二区| 亚洲综合图色| 日韩精品一页| 国产另类在线| 日韩福利一区| 99riav国产精品| 欧美精品导航| 日本电影久久久| 久久久免费人体| 最新日韩欧美| 国产91在线精品| 99国产精品自拍| 亚洲欧洲另类| 欧美午夜三级| 国产精品99久久久久久董美香| 国产高清亚洲| 免费一二一二在线视频| 天堂日韩电影| 亚洲精品高潮| 精品美女在线视频| 欧洲毛片在线视频免费观看| 视频一区日韩精品| 精品美女在线视频| 不卡一区2区| 青青草精品视频| 国产精选在线| 一区二区三区四区精品视频| 美女久久99| 国精品一区二区| 欧美亚洲网站| 99精品电影| 日韩**一区毛片| 国产精品成久久久久| 蜜乳av另类精品一区二区| 精品日本视频| 三级亚洲高清视频| 精品中文在线| 一区二区国产在线观看| 日韩成人a**站| 四虎精品永久免费| 日韩福利一区| 青青草91久久久久久久久| 99久久夜色精品国产亚洲狼| 91福利精品在线观看| 亚洲无线一线二线三线区别av| 欧美亚洲综合视频| 蜜桃视频欧美| 亚洲福利精品| 91亚洲精品视频在线观看| 亚洲成人国产| 国产午夜精品一区在线观看| 免费观看久久av| 麻豆精品少妇| 亚洲香蕉视频|