BigDecimal的一些用法
在多功能計算器專案中,計算器和單位換算功能都要求要有20位的精確度,並且要支援超大數,因此double型別就完全不夠看了(double型別最多支援16位有效數字,且最大值只支援10^308次方),最後確定使用BigDecimal承載資料進行運算。下面我就列出一些BigDecimal的一些常用用法及注意點:
BigDecimal的常用方法:
加:add(BigDecima)
減:subtract(BigDecimal)
乘:multiply(BigDecimal)
除:divide(BigDecimal)
乘方:pow(int)
取絕對值:abs()
取反:negate()
對比:compareTo(BigDecimal)
設定小數點精確度:setScale(int)
設定保留小數點精確度並新增保留方式(直接加1或者四捨五入):setScale(int, int)
BigDecimal支援任意精度,任意長度的浮點數運算,但在運算的時候最好設定各個運算元的小數精確度,特別是除法。結果需要保留幾位小數,如果沒有設定除法的運算元的小數精確度,計算結果的精確度就會和運算元中最低精確度一致,導致計算結果不正確,如下例子:
String a = "1"; String b = "4.56"; BigDecimal aBD = new BigDecimal(a); BigDecimal bBD = new BigDecimal(b); BigDecimal resultBD = aBD.divide(bBD).setScale(3, java.math.BigDecimal.ROUND_HALF_UP);
3是保留小數,ROUND_HALF_UP是四捨五入,此引數的其他值請檢視文章:
http://www.bdqn.cn/news/201311/11834.shtml
這個例子你期望的是0.219,但是你實際會得到0。為什麼呢?這就是保留精確度問題了,a是一個整數,運算時把結果當作整數取了,那就是0了。所以,應該按下面的運算:
String a = "1"; String b = "4.56"; BigDecimal aBD = new BigDecimal(a).setScale(3); BigDecimal bBD = new BigDecimal(b).setScale(3); BigDecimal resultBD = aBD.divide(bBD).setScale(3, java.math.BigDecimal.ROUND_HALF_UP);
這樣,你就會得到一個正確的值了。
還有一個需要注意的點,計算結果,如例子中的resultBD一定要設定其setScale的第二個引數,不然會報錯。如果計算結果沒有按某個方式進行截斷,那麼機器就不知道如何去取這個結果了,因此報錯。
BigDecimal的結果格式化:
將BigDecimal計算的結果toString()輸出,不是按科學計數法的格式的,如果想改成這種格式,可以使用DecimalFormat進行轉換,具體如下: