1. 程式人生 > >BigDecimal的一些用法

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進行轉換,具體如下: