BigDecimal簡介
- BigDecimal用來對需要更大或更小的數進行任意精度的運算。
- 在需要精確的小數計算時再使用BigDecimal,BigDecimal的性能比double和float差,在處理龐大,複雜的運算時尤爲明顯。故一般精度的計算沒必要使用BigDecimal。
- 儘量使用參數類型爲String的構造函數。
- BigDecimal都是不可變的(immutable)的, 在進行每一次四則運算時,都會產生一個新的對象 ,所以在做加減乘除運算時要記得要保存操作後的值。
BigDecimal構造方法
- BigDecimal(BigInteger val)
將 BigInteger轉換成 BigDecimal - BigDecimal(char[] in)
一個轉換的字符數組表示 BigDecimal成 BigDecimal ,接受字符作爲的相同序列 BigDecimal(String)構造 - BigDecimal(double val)
將 double轉換爲 BigDecimal ,這是 double的二進制浮點值的精確十進制表示 - BigDecimal(int val)
將 int成 BigDecimal - BigDecimal(long val)
將 long成 BigDecimal - BigDecimal(String val)
將BigDecimal的字符串表示 BigDecimal轉換爲 BigDecimal
BigDecimal 常用方法 加減乘除運算
BigDecimal a = new BigDecimal(6);
BigDecimal b = new BigDecimal(5);
a.add(b); //a+b 加
a.subtract(b); // a-b 減
a.multiply(b); // a*b 乘
a.divide(b);// a/b 除
a.doubleValue();//轉換成雙精度 double類型
a.floatValue(); //轉換成單精度 float類型
a.longValue(); //轉換成長整形 long 類型
a.intValue(); //轉換成整形 int 類型
a.pow(3);//a的3次方
a.abs();//a的絕對值
BigDecimal數值比較
BigDecimal a = new BigDecimal(6);
int i = a.compareTo(BigDecimal.ZERO); //和0做比較
i==-1;//表示a小於0
i==0;//表示a=0
i==1;//表示a大於0
boolean b1 = a.subtract(b).compareTo(BigDecimal.ZERO) > 0;//判斷a-b是否大於0
BigDecimal常見異常
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
原因:
JAVA中如果用BigDecimal做除法的時候一定要在divide方法中傳遞第二個參數,定義精確到小數點後幾位,否則在不整除的情況下,結果是無限循環小數時,就會拋出以上異常。
解決辦法:
a.divide(b,4,RoundingMode.HALF_UP));
第二個參數是保留小數位數
第三個代表模式
模式:
- ROUND_UP 始終對前一位加1 只入不捨
- ROUND_DOWN 始終不對小數進行改變 只舍不入
- ROUND_CEILING 如果 BigDecimal 爲正,則舍入行爲與 ROUND_UP 相同;如果爲負,則舍入行爲與 ROUND_DOWN 相同。
- ROUND_FLOOR如果 BigDecimal 爲正,則舍入行爲與 ROUND_DOWN 相同;如果爲負,則舍入行爲與 ROUND_UP 相同。
- ROUND_HALF_UP 四捨五入
- ROUND_HALF_DOWN 五舍六入
- ROUND_HALF_EVEN 如果捨棄部分左邊的數字爲奇數,則舍入行爲與 ROUND_HALF_UP 相同;如果爲偶數,則舍入行爲與 ROUND_HALF_DOWN 相同。