java中的數學計算(大整數,小數計算精度)
BigInteger:可以實現大整數計算
構造方法:BigInteger(String val)
注意:尋常Integer是有著明確的數字上限的,它的數值上限是2147483647。因此,如果需要表示超過此數的值,則應該使用BigInteger作為資料型別。
BigInteger做+-*/運算時也是對應著add(val),subtract(val),multiply(val),divide(val)函式;
且其求餘運算需要用到函式divideAndRemainder(val),括號內為除數,該函式的返回值為包含2個元素的BigInteger的陣列,第一個元素為得到的商,第二個元素為餘數。
在java中對小數進行運算時,會出現計算精度的問題,特別是float與double型別很容易丟失精度。所以為了能夠精確表示,在計算浮點數時,java提供了BigDecimal(String val)類。
BigDecimal add(BigDecimal val) //BigDecimal 加法
BigDecimal subtract (BigDecimal val) //BigDecimal 減法
BigDecimal multiply (BigDecimal val) //BigDecimal 乘法
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)
部分內容引自Blog:http://zhangyinhu8680.iteye.com/blog/1536397