引言:
一般整數計算時可以使用int類型的資料,數值較大時使用long類型資料,精度要求不高的小數計算時使用float和double類型資料,當精度要求高的計算時需要使用BigDecimal類型資料。
1.BigDecimal資料定義
BigDecimal a = new BigDecimal(int val);
BigDecimal b = new BigDecimal(long val);
BigDecimal c = new BigDecimal(double val);
BigDecimal d = new BigDecimal(String val);
注:BigDecimal a = new BigDecimal(double val);建議不使用
因為
BigDecimal c = new BigDecimal(0.1);
的運作結果是
0.1000000000000000055511151231257827021181583404541015625
BigDecimal源碼中解釋為This is because 0.1 cannot be represented exactly as a double
如果一定是double資料類型,可以使用
BigDecimal.valueOf(double val);
2.BigDecimal比較大小
BigDecimal中對數字0,1和10做了特殊的定義
BigDecimal.ZERO; BigDecimal.ONE; BigDecimal.TEN
BigDecimal a = new BigDecimal("2.3");
BigDecimal b = new BigDecimal("2.4");
int c = a.compareTo(b);
如果
c==1
則a大于b;
c==-1
則a小于b;
c==0
則a等于b
3.BigDecimal加減乘除運算
a.add(b);//加法
a.subtract(b);//減法
a.multiply(b);//乘法
a.divide(b);//除法
例如:
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
BigDecimal c = a.add(b);
BigDecimal d = a.subtract(b);
BigDecimal e = a.multiply(b);
BigDecimal f = a.divide(b);
當a除以b的商為無限小數時,a.divide(b)會報錯,BigDecimal需要提供小數的位數
BigDecimal g = a.divide(b, int scale, int roundingMode);
b為被除數,第二個參數是小數點後保留位數,第三個參數是取舍模式
取舍模式有以下幾種類型:
#ROUND_UP //進位處理,如3.33會變成3.4
#ROUND_DOWN //直接删除多餘小數位數字,如3.345變成3.34
#ROUND_CEILING //接近正無窮大的舍入,BigDecimal 為正,則舍入行為與 ROUND_UP 相同;如果為負,則舍入行為與 ROUND_DOWN 相同,如2.345變成2.35
#ROUND_FLOOR //接近負無窮大的舍入,BigDecimal 為正,則舍入行為與 ROUND_DOWN 相同;如果為負,則舍入行為與 ROUND_UP 相同,如2.345變成2.34
#ROUND_HALF_UP //向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則為向上舍入,如果舍棄部分 >= 0.5,則與 ROUND_UP 相同;否則與 ROUND_DOWN 相同,如2.345變成2.35(即四舍五入)
#ROUND_HALF_DOWN //向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則為上舍入,如果舍棄部分 > 0.5,則與 ROUND_UP 相同;否則與 ROUND_DOWN 相同,如2.345變成2.34;2.346變成2.35
#ROUND_HALF_EVEN //向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入,如果舍棄部分左邊的數字為奇數,則與 ROUND_HALF_UP 相同;如果為偶數,則與 ROUND_HALF_DOWN 相同,如2.345變成2.34
#ROUND_UNNECESSARY //精确的結果,不需要舍入
4.其他常用方法
setScale(int newScale, int roundingMode); //格式化小數位數,第一個參數為小數保留位數,第二個參數為取舍模式
movePointLeft(int n); //小數點向左移n位
movePointRight(int n); //小數點向右移n位
equals(Object x);//與對象x比較是否相等,與compareTo()不同,隻有當值和精度都相等時,equals()才傳回true,如2.0和2.00
intValue();//将BigDecimal的值轉化為整數傳回
longValue();//将BigDecimal的值轉化為長整數傳回
floatValue();//将BigDecimal的值轉化為單精度小數傳回
doubleValue();//将BigDecimal的值轉化為雙精度小數傳回
toString();//将BigDecimal的值轉化為字元串傳回
5.其他
如果計算的值需要轉化為金額格式或百分數,需要使用NumberFormat
NumberFormat currency = NumberFormat.getCurrencyInstance(); //設定貨币格式¥
NumberFormat percent = NumberFormat.getPercentInstance(); //設定百分比%
BigDecimal a = new BigDecimal("0.8");
System.out.println(currency.format(a.doubleValue()));//¥0.8
System.out.println(percent.format(a.doubleValue()));//80%