色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

淺談Java基礎知識之BigDecimal

瀏覽:3日期:2022-08-12 17:33:27
目錄一、基本使用二、舍入模式三、注意事項四、異常處理 ArithmeticException異常一、基本使用

使用示例:

// 初始化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); // 指數運算, 2 is exponentBigDecimal powerValue=bd2.pow(2); // 四舍五入multiply.setScale(1, RoundingMode.HALF_EVEN);二、舍入模式

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

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

淺談Java基礎知識之BigDecimal

三、注意事項

1.大量的數學計算時,使用 基本數據類型 而不是BigInteger 和 BigDecimal 。

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

2.構造 BigDecimal 時,使用 String 而不是 double 。

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

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

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

4.另外還有一些情形,任意精度的小數運算仍不能表示精確結果。例如,1 除以 9 會產生無限循環的小數 .111111…。出于這個原因,在進行除法運算時,BigDecimal可以讓您顯式地控制舍入。

四、異常處理 ArithmeticException異常

在使用BigDecimal數據類型進行計算時,會有三種情況拋出 ArithmeticException,分別是:

1.當除數為 0 時,這種情況比較常見,所以我們在進行除法運算之前先判斷下除數是否為 0;

2.如果運算的結果是無線循環的小數,并且在除的時候沒有對結果設置精確的位數;BigDecimal divide 方法結果為無限小數問題 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:不設置精度范圍會出現異常

3.當我們設置了結果的舍入模式是 ROUND_UNNECESSARY 模式時:如果確保了計算的結果是精確的,則不會拋出異常;否則,就會拋出ArithmeticException 異常。

4.只設置精度(小數點后面的位數,scale),但沒有設置舍入模式(roundingModel)時,會不知道如何對小數舍入而報錯。所以在設置精度時要連舍入模式一起設置。

// 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.指數運算,指數 exponent 為負數時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 codeBigDecimal powerValue=bd2.pow(-27);// -27 is exponent

到此這篇關于淺談Java基礎知識之BigDecimal的文章就介紹到這了,更多相關Java BigDecimal內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 一色屋精品亚洲香蕉网站 | 久在草 | 毛片免费永久不卡视频观看 | 国产蜜汁tv福利在线 | 最新国产午夜精品视频成人 | 99国产精品欧美久久久久久影院 | 高清国产美女一级a毛片录 高清国产亚洲va精品 | 久久久久久久亚洲精品一区 | 131的美女午夜爱爱爽爽视频 | 成人污网站 | 日韩中文字幕在线亚洲一区 | 韩国免又爽又刺激激情视频 | 看性过程三级视频在线观看 | 国产精品中文字幕在线观看 | 国产精品欧美亚洲日本综合 | 韩国一级片在线观看 | 欧美精品99久久久久久人 | 欧美刺激午夜性久久久久久久 | 成人欧美一区二区三区视频 | 国产精品美女久久福利网站 | 亚洲女人被黑人猛躁进女人 | 老司机精品影院一区二区三区 | 曰本人做爰大片免费观看一 | 九九九热视频 | 拍拍拍又黄又爽无挡视频免费 | 成人a毛片在线看免费全部播放 | 亚洲午夜精品 | 成人黄色免费网址 | 国产精品欧美韩国日本久久 | 国产成人精品日本亚洲网址 | 亚洲人成影院在线高清 | 欧美在线视频 一区二区 | 久久精品青草社区 | 久久亚洲国产高清 | 久久91精品国产91久久户 | 成人区在线观看免费视频 | 香蕉久久久 | 亚洲性影院 | 男人免费看片 | 久久国产精品99久久小说 | 国产精品亚洲片夜色在线 |