在多功能計算器項目中,計算器和單位換算功能都要求要有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進行轉換,具體如下: