引言
由於公司是跟金融行業相關的(錢包),哈哈宣傳一下我們公司~ 所以必不可少使用到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, 此處留下笑臉~