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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM