天天看點

BigDecimal詳細用法

引言:

一般整數計算時可以使用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%