java.math.BigDecimal的用法及加減乘除計算
java.math.BigDecimal及加減乘除計算
BigDecimal簡介
- BigDecimal用來對需要更大或更小的數(shù)進行任意精度的運算。
- 在需要精確的小數(shù)計算時再使用BigDecimal,BigDecimal的性能比double和float差,在處理龐大,復雜的運算時尤為明顯。故一般精度的計算沒必要使用BigDecimal。
- 盡量使用參數(shù)類型為String的構(gòu)造函數(shù)。
- BigDecimal都是不可變的(immutable)的, 在進行每一次四則運算時,都會產(chǎn)生一個新的對象 ,所以在做加減乘除運算時要記得要保存操作后的值。
BigDecimal構(gòu)造方法
BigDecimal(BigInteger val)
將 BigInteger轉(zhuǎn)換成 BigDecimal
BigDecimal(char[] in)
一個轉(zhuǎn)換的字符數(shù)組表示 BigDecimal成 BigDecimal ,接受字符作為的相同序列 BigDecimal(String)構(gòu)造
BigDecimal(double val)
將 double轉(zhuǎn)換為 BigDecimal ,這是 double的二進制浮點值的精確十進制表示
BigDecimal(int val)
將 int成 BigDecimal
BigDecimal(long val)
將 long成 BigDecimal
BigDecimal(String val)
將BigDecimal的字符串表示 BigDecimal轉(zhuǎn)換為 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();//轉(zhuǎn)換成雙精度 double類型 a.floatValue(); //轉(zhuǎn)換成單精度 float類型 a.longValue(); //轉(zhuǎn)換成長整形 long 類型 a.intValue(); ?//轉(zhuǎn)換成整形 int 類型 a.pow(3);//a的3次方 a.abs();//a的絕對值 a.negate();//a的負數(shù)
BigDecimal數(shù)值比較
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方法中傳遞第二個參數(shù),定義精確到小數(shù)點后幾位,否則在不整除的情況下,結(jié)果是無限循環(huán)小數(shù)時,就會拋出以上異常。
解決辦法:
a.divide(b,4,RoundingMode.HALF_UP));
第二個參數(shù)是保留小數(shù)位數(shù)
第三個代表模式
模式:
ROUND_UP
始終對前一位加1 只入不舍ROUND_DOWN
始終不對小數(shù)進行改變 只舍不入ROUND_CEILING
如果 BigDecimal 為正,則舍入行為與 ROUND_UP 相同;如果為負,則舍入行為與 ROUND_DOWN 相同。ROUND_FLOOR
如果 BigDecimal 為正,則舍入行為與 ROUND_DOWN 相同;如果為負,則舍入行為與 ROUND_UP 相同。ROUND_HALF_UP
四舍五入ROUND_HALF_DOWN
五舍六入ROUND_HALF_EVEN
如果舍棄部分左邊的數(shù)字為奇數(shù),則舍入行為與 ROUND_HALF_UP 相同;如果為偶數(shù),則舍入行為與 ROUND_HALF_DOWN 相同。
心得
BigDecimal 主要用來操作(大)浮點數(shù),BigInteger 主要用來操作大整數(shù)(超過 long 類型)。
BigDecimal 的實現(xiàn)利用到了 BigInteger, 所不同的是 BigDecimal 加入了小數(shù)位的概念。
java.math.BigDecimal 比較大小
BigDecimal a = new BigDecimal (101); BigDecimal b = new BigDecimal (111); //使用compareTo方法比較 //注意:a、b均不能為null,否則會報空指針 if(a.compareTo(b) == -1){ System.out.println("a小于b"); } if(a.compareTo(b) == 0){ System.out.println("a等于b"); } if(a.compareTo(b) == 1){ System.out.println("a大于b"); } if(a.compareTo(b) > -1){ System.out.println("a大于等于b"); } if(a.compareTo(b) < 1){ System.out.println("a小于等于b"); }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java編寫通用的導出任何對象列表數(shù)據(jù)到excel的工具類
在工作中經(jīng)常會遇到列表數(shù)據(jù)的導出,每次需要的時候都要去開發(fā)一次,且數(shù)據(jù)不斷在變化,所以本文將利用Java編寫一個工具類可以導出任何對象列表數(shù)據(jù)到excel,希望對大家有所幫助2024-12-12