天涯明月刀ol|天涯明月刀迅雷下载
  1. 當前所在位置:
  2. 首頁
  3. 全民捕魚

BigDecimal的一些用法?如何使用BigDecimal

2018-12-28 admin
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
 
    BigDecimal的一些用法?如何使用BigDecimal 這個例子你期望的是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進行轉換,具體如下:
 
    private static final String EXPR_PATTERN = "0.##########E0";
    private static final String PATTERN = "0.##########";
    private static final String INTEGER_MIN_VALUE_CHANGE_TO_EXPR = "10000000";
    private static final String DECIMAL_MIN_VALUE_CHANGE_TO_EXPR = "0.0001";
    /**
     * Tpv loy.ouyang: jude number is able to convert to expr display
     */
private static boolean numberStringCanConvertToExpr(BigDecimal bd) {
        if (bd == null) {
            return false;
        }
        boolean result = false;
        BigDecimal absDB = bd.abs();
        if ((absDB.compareTo(new BigDecimal(DECIMAL_MIN_VALUE_CHANGE_TO_EXPR)) <= 0) ||
                (absDB.compareTo(new BigDecimal(INTEGER_MIN_VALUE_CHANGE_TO_EXPR)) >= 0)) {
            result = true;
        }
 
        if (absDB.compareTo(new BigDecimal(0)) == 0) {
            result = false;
        }
        return result;
    }
 
    /**
     * Tpv loy.ouyang: format string to expr to display
     */
    public static String formatStringToExpr(BigDecimal bd) {
        if (bd == null) {
            return null;
        }
        DecimalFormat df = new DecimalFormat();
        if (numberStringCanConvertToExpr(bd)) {
            df.applyPattern(EXPR_PATTERN);
        } else {
            df.applyPattern(PATTERN);
BigDecimal的一些用法?如何使用BigDecimal 
        }
        return df.format(bd);
    }
定義了超大數和超小數的顯示PATTERN,0.##########代表最多顯示10位小數,并判定絕對值多大的數和絕對值多小的數需要轉化位科學記數法,最后用DecimalFormat就可以搞定了
--------------------- 
作者:loy_ouyang 
來源:CSDN 
原文:https://blog.csdn.net/loy_ouyang/article/details/79370068 
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
捕魚駕到 天涯明月刀ol