国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

BigDecimal簡介

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

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

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

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);

輸出結(jié)果:

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);

輸出結(jié)果:

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);

輸出結(jié)果:

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);

輸出結(jié)果:

number1 divide number2 = 8

因為上面2個數(shù)可以整除,所以這么用沒有問題,不過一但不能被整除,這么用就會有潛在的風(fēng)險,會拋出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);

輸出結(jié)果:

number1 divide number2 = 7.99

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

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

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

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

1.5 保留小數(shù)位數(shù)

如果我們想對BigDecimal類型保留小數(shù)位數(shù),可以使用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位小數(shù),四舍五入BigDecimal number4 = number3.setScale(3, RoundingMode.HALF_UP);System.out.println('number3 setScale = ' + number4);

輸出結(jié)果:

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));

輸出結(jié)果:

number1 compareTo number2 = 1

number1 compareTo number3 = -1

number1 compareTo number4 = 0

由輸出結(jié)果可以看出:

當(dāng)number1小于number2時,返回-1,

當(dāng)number1等于number2時,返回0,

當(dāng)number1大于number2時,返回1。

2. 踩坑總結(jié)

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

報錯原因是因為無法整除,導(dǎo)致結(jié)果是無限循環(huán)小數(shù):

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

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

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

此時不再報錯,輸出結(jié)果為:

885

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

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

此時的輸出結(jié)果為:

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;

總結(jié)

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日本尹人综合香蕉在线观看 | 久久a热6| 69性欧美 | 高清波多野结衣一区二区三区 | 国产成人v视频在线观看 | 成年人免费网站在线观看 | pgone太大了兽王免费视频 | 国产欧美一区二区三区免费看 | 特级淫片国产免费高清视频 | 91久久久久久久 | 黄 色 成 年 人小说 | 天堂视频在线免费观看 | 一级做人爱a视频正版免费 一级做性色a爱片久久片 | 久久精品国产免费观看99 | 在线观看国产一区二区三区99 | 久久久久久福利 | jiz欧美高清 | 欧洲乱码伦视频免费 | 在线观看中文字幕国产 | 日韩国产欧美在线观看一区二区 | 日韩欧国产精品一区综合无码 | 亚洲日韩中文字幕在线播放 | 久久99国产精品久久99果冻传媒 | 97se亚洲综合在线韩国专区福利 | 免费特黄一级欧美大片在线看 | 欧美日韩精品国产一区二区 | 日韩视频一区二区三区 | 99热在线获取最新地址 | 久久久久久综合对白国产 | 国产老妇k | 欧美精品免费看 | 日韩一区二区久久久久久 | 欧美成人免费一级人片 | 一本色道久久综合 | 亚洲精品人成网在线播放影院 | 国产中的精品一区的 | 国内自拍第100页 | 国产成人久久777777 | 久久久9视频在线观看 | 国产成人综合在线 | 在线亚洲精品国产成人二区 |