你知道的BigDecimal哪些事~

引言

由於公司是跟金融行業相關的(錢包),哈哈宣傳一下我們公司~ 所以必不可少使用到BigDecimal對象,以前使用過,但是隻是偶爾可能使用,深度還有待提高,所以這次總結一下BigDecimal的使用.

是什麼 ?

它是我們java.math包下的API,繼承number實現comparable ,根據它所在的位置,我們可以大體定位他的作用,math下的包肯定加減乘除是ok的,它繼承了number,那他和double,float有什麼區別? 他們的相同點都是對數字進行操作,但是區別是什麼? 它實現了compareable接口對數字比較完全可以使用,但是在使用的過程中需要避免踩一下坑,例如我,(此處留下苦笑表情包)

它爲什麼會出現?

java在浮點類型中提供了4爲的float類型和8位的double類型, 他們都是對小數點進行操作,但是在java運行的時候會丟失精度問題,如果你的公司處於金融行業, 一定不要使用float or double , 虧大發~ ,

java提供BigDecimal對象來處理浮點數,用來針對於超過16位有效位數做精確的運算.當我們大體知道他爲什麼出現的時候,使用它的時候便順手了~

如何使用?

BigDecimal 構造方法

BigDecimal 有 很多種構造方法, 我就不一一列舉了,感興趣的可以自己玩玩~ , 介紹一下比較常用的

 public static void main(String[] args) {
        BigDecimal decimal = new BigDecimal(88.8);
        System.out.println(decimal);
    }

運行結果: 88.7999999999999971578290569595992565155029296875

如果我們的構造參數裏面填的是String類型

public static void main(String[] args) {
        BigDecimal decimal = new BigDecimal("88.8");
        System.out.println(decimal);
    }
運行結果: 88.8

爲什麼會是這個效果? 我們看一下源碼是如何操作的? 具體我就不玩往下跟蹤代碼了,大體就是根據他的它的offset和len長度進行計算的.如果字符序列已經可用作字符數組,則使用此構造函數比將char數組轉換爲字符串並使用BigDecimal(String)構造函數更快在這裏插入圖片描述

BigDecimal- 加減乘除運算

       Double num1 = 88.8;
        Double num2 = 99.9;
        BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
        BigDecimal decimal2 = new BigDecimal(Double.toString(num2));
        //加
        System.out.println(decimal1.add(decimal2));
        //減
        System.out.println(decimal2.subtract(decimal1));
        //剩
        System.out.println(decimal1.multiply(decimal2));
        //除
        System.out.println(decimal2.divide(decimal1));

結果 : 
188.7
11.1
8871.12
1.125

BigDecimal Round 模式 ?

在看完BigDecimal的運算之後,你在心理有沒有小疑問? 除法約等於如何做到? , 讓我們一起揭開面紗~

//舍入模式從零開始。 始終在非零丟棄分數之前增加數字。 
public static final int ROUND_UP   
  Double num1 = 122.466;
  BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
  BigDecimal decimal = decimal1.setScale(1, BigDecimal.ROUND_UP);
  System.out.println(decimal.toString());      
運行結果: 122.5  

//舍入模式向零舍入。 不要在丟棄的分數之前遞增數字(即截斷)。 請注意,該舍入模式不會增加計算值的大小,其實就是直接省略多餘的小數
public static final int ROUND_DOWN
  Double num1 = 122.466;
  BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
  BigDecimal decimal = decimal1.setScale(1, BigDecimal.ROUND_DOWN);
  System.out.println(decimal.toString()); 
運行結果:122.4  

// 如果與兩個相鄰數字的距離相等,則爲上舍入的舍入模式
public static final int ROUND_HALF_UP
    Double num1 = 122.55;
    BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
    BigDecimal decimal = decimal1.setScale(1, BigDecimal.ROUND_HALF_UP);
    System.out.println(decimal.toString());
運行結果: 122.6



//ROUND_HALF_DOWN 兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。如果是大於0.5,則去掉最後一個與ROUND_UP 相同
public static final int ROUND_HALF_DOWN
    Double num1 = 122.55;
    BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
    BigDecimal decimal = decimal1.setScale(1, BigDecimal.ROUND_HALF_DOWN);
    System.out.println(decimal.toString());
運行結果: 122.5

總結

好久不寫博客,生疏了不少,csdn樣式都變了,哈哈哈,下一篇就得等到下週給大家分享了,下週給大家分享阿里的代碼規範, 順便提醒自己代碼規範問題, 寫出一手漂亮的代碼666, 此處留下笑臉~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章