欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Java基礎(chǔ)知識(shí)之BigDecimal

 更新時(shí)間:2021年05月13日 11:01:22   投稿:lan00zi  
我們又來(lái)回顧Java基礎(chǔ)知識(shí)啦,今天講的是BigDecimal的基本使用以及異常處理,下文中有非常詳細(xì)的代碼示例以及注釋哦,需要的朋友可以參考下

一、基本使用

使用示例:

// 初始化
BigDecimal bd1=new BigDecimal("456");
BigDecimal bd2=new BigDecimal("123");

// 加
BigDecimal add=bd1.add(bd2);
// 減
BigDecimal subtract=bd1.subtract(bd2);  
// 乘
BigDecimal multiply=bd1.multiply(bd2); 
// 除
BigDecimal divide=bd1.divide(bd2);     

// 指數(shù)運(yùn)算, 2 is exponent
BigDecimal powerValue=bd2.pow(2);     

// 四舍五入
multiply.setScale(1, RoundingMode.HALF_EVEN);

二、舍入模式

枚舉類 java.math.RoundingMode 定義了8種數(shù)據(jù)的舍入模式,在 BigDecimal 中,可以用 BigDecimal.setScale(int newScale, RoundingMode roundingMode) 來(lái)設(shè)置數(shù)據(jù)的精度和舍入模式。

  • ROUND_UP:向遠(yuǎn)離零的方向舍入。
  • 若舍入位為非零,則對(duì)舍入部分的前一位數(shù)字加1;若舍入位為零,則直接舍棄。即為向外取整模式。
  • ROUND_DOWN:向接近零的方向舍入。
  • 不論舍入位是否為零,都直接舍棄。即為向內(nèi)取整模式。
  • ROUND_CEILING:向正無(wú)窮大的方向舍入。
  • BigDecimal 為正,則舍入行為與 ROUND_UP 相同;若為負(fù),則舍入行為與 ROUND_DOWN 相同。即為向上取整模式。
  • ROUND_FLOOR:向負(fù)無(wú)窮大的方向舍入。
  • BigDecimal 為正,則舍入行為與 ROUND_DOWN 相同;若為負(fù),則舍入行為與 ROUND_UP 相同。即為向下取整模式。
  • ROUND_HALF_UP:向“最接近的”整數(shù)舍入。
  • 若舍入位大于等于5,則對(duì)舍入部分的前一位數(shù)字加1;若舍入位小于5,則直接舍棄。即為四舍五入模式。
  • ROUND_HALF_DOWN:向“最接近的”整數(shù)舍入。
  • 若舍入位大于5,則對(duì)舍入部分的前一位數(shù)字加1;若舍入位小于等于5,則直接舍棄。即為五舍六入模式。
  • ROUND_HALF_EVEN:向“最接近的”整數(shù)舍入。
  • 若(舍入位大于5)或者(舍入位等于5且前一位為奇數(shù)),則對(duì)舍入部分的前一位數(shù)字加1;
  • 若(舍入位小于5)或者(舍入位等于5且前一位為偶數(shù)),則直接舍棄。即為銀行家舍入模式。
  • ROUND_UNNECESSARY
  • 斷言請(qǐng)求的操作具有精確的結(jié)果,因此不需要舍入。
  • 如果對(duì)獲得精確結(jié)果的操作指定此舍入模式,則拋出ArithmeticException。

在這里插入圖片描述

三、注意事項(xiàng)

1.大量的數(shù)學(xué)計(jì)算時(shí),使用 基本數(shù)據(jù)類型 而不是BigIntegerBigDecimal 。

原因:由于是不可變(immutable)的,在進(jìn)行每一步運(yùn)算時(shí),都會(huì)產(chǎn)生一個(gè)新的對(duì)象,引起開銷。
建議:應(yīng)盡量用 long , float , double 等基本類型做科學(xué)計(jì)算或者工程計(jì)算。
設(shè)計(jì)的目的是用來(lái)精確地表示大整數(shù)和小數(shù),例如進(jìn)行金額等比較敏感的數(shù)據(jù)運(yùn)算。

2.構(gòu)造 BigDecimal 時(shí),使用 String 而不是 double 。

原因:有些數(shù)字用 double 根本無(wú)法精確表示,傳給 BigDecimal 構(gòu)造方法時(shí)就已經(jīng)不精確了。例如:new BigDecimal(0.1)得到的值是0.1000000000000000055511151231257827021181583404541015625。
建議:使用 new BigDecimal(“0.1”) 得到的值是 0.1。
BigDecimal 有4個(gè)構(gòu)造方法,其中的兩個(gè)用 BigInteger 構(gòu)造,一個(gè)用 double 構(gòu)造,一個(gè)用 String 構(gòu)造。

3.比較兩個(gè) BigDecimal 值時(shí),使用 compareTo() 而不是 equals()。

原因: equals() 方法認(rèn)為 0.1 和 0.1 是相等的,返回true;認(rèn)為 0.10 和 0.1 是不等的,返回false。
compareTo() 方法則認(rèn)為 0.1 與 0.1 相等,0.10 與 0.1 也相等。

4.另外還有一些情形,任意精度的小數(shù)運(yùn)算仍不能表示精確結(jié)果。例如,1 除以 9 會(huì)產(chǎn)生無(wú)限循環(huán)的小數(shù) .111111…。
出于這個(gè)原因,在進(jìn)行除法運(yùn)算時(shí),BigDecimal可以讓您顯式地控制舍入。

四、異常處理 ArithmeticException異常

在使用BigDecimal數(shù)據(jù)類型進(jìn)行計(jì)算時(shí),會(huì)有三種情況拋出 ArithmeticException,分別是:

1.當(dāng)除數(shù)為 0 時(shí),這種情況比較常見,所以我們?cè)谶M(jìn)行除法運(yùn)算之前先判斷下除數(shù)是否為 0;

2.如果運(yùn)算的結(jié)果是無(wú)線循環(huán)的小數(shù),并且在除的時(shí)候沒有對(duì)結(jié)果設(shè)置精確的位數(shù);
BigDecimal divide 方法結(jié)果為無(wú)限小數(shù)問(wèn)題 10/3=3.3333333333333333…

public static void main(String[] args) {
	BigDecimal a = new BigDecimal("10");
	BigDecimal o = new BigDecimal("3");
	System.out.print(a.divide(o,2, BigDecimal.ROUND_DOWN).doubleValue());
}

Note:不設(shè)置精度范圍會(huì)出現(xiàn)異常

3.當(dāng)我們?cè)O(shè)置了結(jié)果的舍入模式是 ROUND_UNNECESSARY 模式時(shí):
如果確保了計(jì)算的結(jié)果是精確的,則不會(huì)拋出異常;否則,就會(huì)拋出ArithmeticException 異常。

4.只設(shè)置精度(小數(shù)點(diǎn)后面的位數(shù),scale),但沒有設(shè)置舍入模式(roundingModel)時(shí),會(huì)不知道如何對(duì)小數(shù)舍入而報(bào)錯(cuò)。
所以在設(shè)置精度時(shí)要連舍入模式一起設(shè)置。

// wrong code
 bd = new BigDecimal(1.5); // is actually 1.4999....
 bd.setScale(1); // throws ArithmeticException
 
 // wright code
 a = new BigDecimal("2.5"); // digit left of 5 is even, so round down
 b = new BigDecimal("1.5"); // digit left of 5 is odd, so round up
 a.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString() // => 2
 b.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString() // => 2

5.指數(shù)運(yùn)算,指數(shù) exponent 為負(fù)數(shù)時(shí)
If you are raising things to negative exponents, you must specify a MathContext in BigDecimal.pow(int, MathContext) so it knows how much precision to use – otherwise, BigDecimal will try to compute it to infinite precision, which is not possible for some values.

//wrong code
BigDecimal powerValue=bd2.pow(-27);// -27 is exponent

到此這篇關(guān)于淺談Java基礎(chǔ)知識(shí)之BigDecimal的文章就介紹到這了,更多相關(guān)Java BigDecimal內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot啟動(dòng)多數(shù)據(jù)源找不到合適的驅(qū)動(dòng)類問(wèn)題

    SpringBoot啟動(dòng)多數(shù)據(jù)源找不到合適的驅(qū)動(dòng)類問(wèn)題

    這篇文章主要介紹了SpringBoot啟動(dòng)多數(shù)據(jù)源找不到合適的驅(qū)動(dòng)類問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring中ApplicationEvent事件機(jī)制源碼詳解

    Spring中ApplicationEvent事件機(jī)制源碼詳解

    這篇文章主要介紹了Spring中ApplicationEvent事件機(jī)制源碼詳解,Spring中與事件有關(guān)的接口和類主要包括ApplicationEvent、ApplicationListener,下面來(lái)看一下Spring中事件的具體應(yīng)用,需要的朋友可以參考下
    2023-09-09
  • SpringBoot實(shí)現(xiàn)過(guò)濾器攔截器的耗時(shí)對(duì)比

    SpringBoot實(shí)現(xiàn)過(guò)濾器攔截器的耗時(shí)對(duì)比

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)過(guò)濾器攔截器的輸出接口耗時(shí)對(duì)比,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-06-06
  • java kafka寫入數(shù)據(jù)到HDFS問(wèn)題

    java kafka寫入數(shù)據(jù)到HDFS問(wèn)題

    這篇文章主要介紹了java kafka寫入數(shù)據(jù)到HDFS問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • java如何獲取byte的高四位和低四位

    java如何獲取byte的高四位和低四位

    這篇文章主要介紹了java如何獲取byte的高四位和低四位,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • JAVA設(shè)計(jì)模式之訪問(wèn)者模式詳解

    JAVA設(shè)計(jì)模式之訪問(wèn)者模式詳解

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之訪問(wèn)者模式詳解,訪問(wèn)者模式是對(duì)象的行為模式,訪問(wèn)者模式的目的是封裝一些施加于某種數(shù)據(jù)結(jié)構(gòu)元素之上的操作,需要的朋友可以參考下
    2015-04-04
  • 基于Java實(shí)現(xiàn)音樂播放器的示例代碼

    基于Java實(shí)現(xiàn)音樂播放器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫一個(gè)簡(jiǎn)單的音樂播放器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-07-07
  • Mac配置 maven以及環(huán)境變量設(shè)置方式

    Mac配置 maven以及環(huán)境變量設(shè)置方式

    這篇文章主要介紹了Mac配置 maven以及環(huán)境變量設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解Java中的線程池

    詳解Java中的線程池

    這篇文章主要介紹了Java中的線程池,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • java 中數(shù)組初始化實(shí)例詳解

    java 中數(shù)組初始化實(shí)例詳解

    這篇文章主要介紹了 本文主要講數(shù)組的初始化方法、可變參數(shù)列表以及可變參數(shù)列表對(duì)函數(shù)重載的影響的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評(píng)論