轉貼:http://zhangyinhu8680.iteye.com/blog/1536397java
BigDecimal 由任意精度的整數非標度值 和 32 位的整數標度 (scale) 組成。若是爲零或正數,則標度是小數點後的位數。若是爲負數,則將該數的非標度值乘以 10 的負 scale 次冪。所以,BigDecimal 表示的數值是 (unscaledValue × 10-scale)。
能夠處理任意長度的浮點數運算。
BigDecimal add(BigDecimal val) //加法
BigDecimal subtract (BigDecimal val) //減法
BigDecimal multiply (BigDecimal val) //乘法
BigDecimal divide (BigDecimal val,RoundingMode mode) //除法
具體使用 計算:
加: a.add(b);
減: a.subtract(b);
乘: a.multiply(b);
除: a.divide(b,2);//2爲精度取值
除法細解:
//注意如下相除會拋出異常,緣由: 經過BigDecimal的divide方法進行除法時當不整除,出現無限循環小數時,就會拋異常
//BigDecimal divideBg = a.divide(b);
//解決方法是:設置精確度;就是給divide設置精確的小數點
divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)
//其中的第二個參數表示的是:保留小數點以後多少位
BigDecimal不整除拋出的異常,請設置精確度!
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1278)
at main.Main.main(Main.java:41)
下面咱們來看看除法的詳細說明:
divide(BigDecimal divisor, int scale, introundingMode)
BigDecimal的setScale方法
BigDecimal.setScale()
方法用於格式化小數點
表示保留一位小數,默認用四捨五入方式
setScale(1)
直接刪除多餘的小數位,如2.35會變成2.3 setScale(1,BigDecimal.ROUND_DOWN)
進位處理,2.35變成2.4 setScale(1,BigDecimal.ROUND_UP)
四捨五入,2.35變成2.4 setScale(1,BigDecimal.ROUND_HALF_UP)
四捨五入,2.35變成2.3,若是是5則向下舍setScaler(1,BigDecimal.ROUND_HALF_DOWN)
注意點一
scale指的是你小數點後的位數。
scale()就是BigDecimal類中的方法。如
BigDecimal b = new BigDecimal("123.456");
b.scale()返回的就是3
注意點二roundingMode是小數的保留模式。它們都是BigDecimal中的常量字段,
有不少種,如
BigDecimal.ROUND_HALF_UP表示的就是4舍5入
注意點三
divide(BigDecimal divisor, int scale, introundingMode)的意思是說:
我用一個BigDecimal對象除以divisor後的結果,而且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊仍是其它的
BigDecimal aa = new BigDecimal(135.95 );
BigDecimal bb=new BigDecimal("100" );
BigDecimal result=aa.multiply(bb); //作乘法
3.java中 BigDecimal類型的能夠轉換到double類型:
用 變量.doubleValue();函數 便可將 BigDecimal 類型數據 轉化爲 double類型!
4.java BigDecimal比較大小
能夠經過BigDecimal的compareTo方法來進行比較。
返回的結果是int類型,-1表示小於,0是等於,1是大於。
看下面這個例子:
BigDecimal a = new BigDecimal("1.00");
BigDecmial b = new BigDecimal(1);
緣由是:BigDecimal比較時,不只比較值,並且還比較精度
if(a.compareTo(b)==0) 結果是true
比較大小能夠用 a.compareTo(b)
返回值 -1 小於 0 等於 1 大於
5.BigDecimal取其中最大、最小值、絕對值、相反數:
a.max (b) //比較取最大值
a.min(b) //比較取最小值
a.abs()//取最絕對值
a.negate()//取相反數
6.下面是注意 :
BigDecimal枚舉常量用法摘要 :
CEILING
向正無限大方向舍入的舍入模式。
DOWN
向零方向舍入的舍入模式。
FLOOR
向負無限大方向舍入的舍入模式。
HALF_DOWN
向最接近數字方向舍入的舍入模式,若是與兩個相鄰數字的距離相等,則向下舍入。
HALF_EVEN
向最接近數字方向舍入的舍入模式,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。
HALF_UP
向最接近數字方向舍入的舍入模式,若是與兩個相鄰數字的距離相等,則向上舍入。
UNNECESSARY
用於斷言請求的操做具備精確結果的舍入模式,所以不須要舍入。
UP
遠離零方向舍入的舍入模式。
ide