最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年08月28日 10:27:23   作者:申城異鄉(xiāng)人  
Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算。這篇文章主要介紹了Java BigDecimal使用指南針(推薦),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

BigDecimal簡介

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

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

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

1. 基本運(yùn)算

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異常,所以強(qiáng)烈建議像下面這樣使用

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類型進(jìn)行計算時,比如上面提到的加、減、乘、除、比較大小時,一定要保證參與計算的兩個值不能為空,否則會拋出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);

拋出的異常如下圖所示:

2.2 ArithmeticException異常

一次在使用BigDecimaldivide方法時,拋出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);

運(yùn)行時拋出以下異常:

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

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

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

// 不含稅金額 = 含稅金額 / (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,會有下面這樣的提示:

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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)對map的字典序排序操作示例

    java實現(xiàn)對map的字典序排序操作示例

    這篇文章主要介紹了java實現(xiàn)對map的字典序排序操作,結(jié)合實例形式分析了java參照微信官網(wǎng)算法實現(xiàn)的字典序排序操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • java.lang.ClassCastException的問題解決

    java.lang.ClassCastException的問題解決

    本文主要介紹了java.lang.ClassCastException的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 深入理解Java設(shè)計模式之單例模式

    深入理解Java設(shè)計模式之單例模式

    這篇文章主要介紹了JAVA設(shè)計模式之單例模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2021-11-11
  • 自動配置@EnableAutoConfiguration問題

    自動配置@EnableAutoConfiguration問題

    這篇文章主要介紹了自動配置@EnableAutoConfiguration問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解Java Spring各種依賴注入注解的區(qū)別

    詳解Java Spring各種依賴注入注解的區(qū)別

    這篇文章主要介紹了詳解Java Spring各種依賴注入注解的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 基于獲取JAVA路徑,包括CLASSPATH外的路徑的方法詳解

    基于獲取JAVA路徑,包括CLASSPATH外的路徑的方法詳解

    本篇文章是對獲取JAVA路徑,包括CLASSPATH外的路徑的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Java  Option用法詳解

    Java  Option用法詳解

    Optional類是Java8為了解決null值判斷問題,借鑒google guava類庫的Optional類而引入的一個同名Optional類,使用Optional類可以避免顯式的null值判斷,避免null導(dǎo)致的NPE,下面以一些典型場景為例,列出Optional API常用接口的用法,并附上相應(yīng)代碼,感興趣的朋友一起看看吧
    2024-01-01
  • Spring的連接數(shù)據(jù)庫以及JDBC模板(實例講解)

    Spring的連接數(shù)據(jù)庫以及JDBC模板(實例講解)

    下面小編就為大家?guī)硪黄猄pring的連接數(shù)據(jù)庫以及JDBC模板(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • ZooKeeper入門教程二在單機(jī)和集群環(huán)境下的安裝搭建及使用

    ZooKeeper入門教程二在單機(jī)和集群環(huán)境下的安裝搭建及使用

    本文是ZooKeeper入門系列教程,涵蓋ZooKeeper的安裝使及單機(jī)集群環(huán)境搭建,通過實例和大量圖表,結(jié)合實戰(zhàn),幫助學(xué)習(xí)者理解和運(yùn)用,有需要的朋友可以借鑒參考下
    2022-01-01
  • SpringBoot使用CXF集成WebService的方法

    SpringBoot使用CXF集成WebService的方法

    這篇文章主要介紹了SpringBoot使用CXF集成WebService的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

安多县| 兰坪| 崇左市| 额尔古纳市| 佛冈县| 晋州市| 新郑市| 西乡县| 平和县| 吴忠市| 嵊州市| 舒兰市| 彭州市| 贺州市| 桃园县| 锦州市| 勐海县| 贺州市| 鹤岗市| 金塔县| 蒙自县| 托克逊县| 邹平县| 黑水县| 东乡县| 榆树市| 加查县| 内丘县| 昭苏县| 长阳| 寿光市| 耒阳市| 依兰县| 阜阳市| 靖边县| 迁安市| 东山县| 松滋市| 团风县| 普洱| 辽宁省|