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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章