BigDecimal經常使用方法

BigDecimal.setScale()方法用於格式化小數點


setScale(1)表示保留一位小數,默認用四捨五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接刪除多餘的小數位,如2.35會變成2.3 
setScale(1,BigDecimal.ROUND_UP)進位處理,2.31變成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四捨五入,2.35變成2.4java

setScaler(1,BigDecimal.ROUND_HALF_DOWN)四捨五入,2.35變成2.3,若是是5則向下舍ide

 

註釋:spa

1:scale指的是小數點後的位數。好比123.456則scale就是3.
scale()就是BigDecimal類中的方法。
好比:BigDecimal b = new BigDecimal("123.456");對象

b.scale(),返回的就是3.ip

2:
roundingMode是小數的保留模式。它們都是BigDecimal中的常量字段,有不少種。
好比:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
3:
pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是說:我用一個BigDecimal對象除以divisor後的結果,而且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊仍是其它的,你能夠本身選!ci

4:對於通常add、subtract、multiply方法的小數位格式化以下:數學

BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("mData=" + mData);
it

----結果:----- mData=9.66io

 

Java中BigDecimal的8種舍入模式

java.math.BigDecimaltable

不可變的、任意精度的有符號十進制數。BigDecimal 由任意精度的整數非標度值和32位的整數標度(scale)組成。

若是爲零或正數,則標度是小數點後的位數。若是爲負數,則將該數的非標度值乘以10的負scale次冪。

所以,BigDecimal表示的數值是(unscaledValue × 10-scale)。

與之相關的還有兩個類:

java.math.MathContext:

該對象是封裝上下文設置的不可變對象,它描述數字運算符的某些規則,如數據的精度,舍入方式等。

java.math.RoundingMode:

這是一種枚舉類型,定義了不少經常使用的數據舍入方式。

這個類用起來仍是很比較複雜的,緣由在於舍入模式,數據運算規則太多太多,

不是數學專業出身的人看着中文API都難以理解,這些規則在實際中使用的時候在翻閱都來得及。

在銀行、賬戶、計費等領域,BigDecimal提供了精確的數值計算。其中8種舍入方式值得掌握。

一、ROUND_UP

舍入遠離零的舍入模式。

在丟棄非零部分以前始終增長數字(始終對非零捨棄部分前面的數字加1)。

注意,此舍入模式始終不會減小計算值的大小。

二、ROUND_DOWN

接近零的舍入模式。

在丟棄某部分以前始終不增長數字(從不對捨棄部分前面的數字加1,即截短)。

注意,此舍入模式始終不會增長計算值的大小。

三、ROUND_CEILING

接近正無窮大的舍入模式。

若是 BigDecimal 爲正,則舍入行爲與 ROUND_UP 相同;

若是爲負,則舍入行爲與 ROUND_DOWN 相同。

注意,此舍入模式始終不會減小計算值。

四、ROUND_FLOOR

接近負無窮大的舍入模式。

若是 BigDecimal 爲正,則舍入行爲與 ROUND_DOWN 相同;

若是爲負,則舍入行爲與 ROUND_UP 相同。

注意,此舍入模式始終不會增長計算值。

五、ROUND_HALF_UP

向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。

若是捨棄部分 >= 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同。

注意,這是咱們大多數人在小學時就學過的舍入模式(四捨五入)。

六、ROUND_HALF_DOWN

向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲上舍入的舍入模式。

若是捨棄部分 > 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同(五舍六入)。

七、ROUND_HALF_EVEN

向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。

若是捨棄部分左邊的數字爲奇數,則舍入行爲與 ROUND_HALF_UP 相同;

若是爲偶數,則舍入行爲與 ROUND_HALF_DOWN 相同。

注意,在重複進行一系列計算時,此舍入模式能夠將累加錯誤減到最小。

此舍入模式也稱爲「銀行家舍入法」,主要在美國使用。四捨六入,五分兩種狀況。

若是前一位爲奇數,則入位,不然捨去。

如下例子爲保留小數點1位,那麼這種舍入方式下的結果。

1.15>1.2 1.25>1.2

八、ROUND_UNNECESSARY

斷言請求的操做具備精確的結果,所以不須要舍入。

若是對得到精確結果的操做指定此舍入模式,則拋出ArithmeticException。

 

不一樣舍入模式下的舍入操做彙總

  根據給定的舍入模式將輸入數字舍入爲一位數的結果
輸入數字 UP DOWN CEILING FLOOR HALF_UP HALF_DOWN HALF_EVEN UNNECESSARY
5.5 6 5 6 5 6 5 6 拋出 ArithmeticException
2.5 3 2 3 2 3 2 2 拋出 ArithmeticException
1.6 2 1 2 1 2 2 2 拋出 ArithmeticException
1.1 2 1 2 1 1 1 1 拋出 ArithmeticException
1.0 1 1 1 1 1 1 1 1
-1.0 -1 -1 -1 -1 -1 -1 -1 -1
-1.1 -2 -1 -1 -2 -1 -1 -1 拋出 ArithmeticException
-1.6 -2 -1 -1 -2 -2 -2 -2 拋出 ArithmeticException
-2.5 -3 -2 -2 -3 -3 -2 -2 拋出 ArithmeticException
-5.5 -6 -5 -5 -6 -6 -5 -6 拋出 ArithmeticException

 

BigDecimal的加減乘除方法

  1. BigDecimal bignum1 = new BigDecimal("10");  
  2. BigDecimal bignum2 = new BigDecimal("5");  
  3. BigDecimal bignum3 = null;  
  4.   
  5. //加法  
  6. bignum3 =  bignum1.add(bignum2);       
  7. System.out.println("和 是:" + bignum3);  
  8.   
  9. //減法  
  10. bignum3 = bignum1.subtract(bignum2);  
  11. System.out.println("差  是:" + bignum3);  
  12.   
  13. //乘法  
  14. bignum3 = bignum1.multiply(bignum2);  
  15. System.out.println("積  是:" + bignum3);  
  16.   
  17. //除法  
  18. bignum3 = bignum1.divide(bignum2);  
  19. System.out.println("商  是:" + bignum3);  

運行結果爲:

BigDecimal 的比較大小。

  1. BigDecimal num1 = new BigDecimal("0");  
  2. BigDecimal num2 = new BigDecimal("1");  
  3. BigDecimal num3 = new BigDecimal("2");  
  4.   
  5. BigDecimal num = new BigDecimal("1"); //用作比較的值  
  6.   
  7. System.out.println(num1.compareTo(num));    //小於 時,返回 -1  
  8. System.out.println(num2.compareTo(num));    //等於 時,返回 0  
  9. System.out.println(num3.compareTo(num));    //大於 時,返回 1  
相關文章
相關標籤/搜索