天天看點

87_BigDecimal的doubleValue()、toString()、toPlainString()與科學計數法

主題:BigDecimal.toPlainString()可以避免出現科學計數法格式的資料。

項目上面有個小夥伴在用Bigdecimal進行數值計算時,用return num.doubleValue()+"";的方式将結果送到前台,測試數值較小時無問題,實際項目運作時,數值較大,結果頁面顯示的内容變為科學計數法形式。發現問題後,又一小夥伴将之改為return num.toString();,結果顯示恢複正常。偶然的機會,我看到這個代碼時,發現了這個錯誤,我記得toString()在某些特定的數值上會變為科學計數法,而toPlainString()這個方法才是永恒不變,始終顯示Bigdecimal的原本數值。為了說服小夥伴,我花了幾分鐘時間寫了個測試的方法,代碼如下:

import java.math.BigDecimal;
 
public class Test {
 
    public static void main(String[] args) {
        BigDecimal a1 = new BigDecimal("1");
        // 小數位數遞增
        for (int i = 0; i < 20; i++) {
            a1 = a1.multiply(new BigDecimal("0.1"));
            System.out.println("----------------------" + (i + 1) + "位小數時的輸出結果-------------------------");
            System.out.println("doubleValue方法顯示數值:                         " + a1.doubleValue());
            System.out.println("toString方法顯示數值:                                 " + a1.toString());
            System.out.println("toPlainString方法顯示數值:                    " + a1.toPlainString());
        }
        System.out.println("\n\n");
        a1 = new BigDecimal("1");
        // 整數位數遞增
        for (int i = 1; i < 20; i++) {
            a1 = a1.multiply(new BigDecimal("10"));
            System.out.println("----------------------" + (i + 1) + "位整數時的輸出結果-------------------------");
            System.out.println("doubleValue方法顯示數值:                         " + a1.doubleValue());
            System.out.println("toString方法顯示數值:                                 " + a1.toString());
            System.out.println("toPlainString方法顯示數值:                    " + a1.toPlainString());
        }
        System.out.println("\n\n");
        // 始終兩位小數位,整數位遞增
        a1 = new BigDecimal("1");
        for (int i = 1; i < 30; i++) {
            a1 = a1.setScale(0, BigDecimal.ROUND_DOWN).multiply(new BigDecimal("10.11"));
            System.out.println("----------------------" + i + "位整數,2位小數時的輸出結果-------------------------");
            System.out.println("doubleValue方法顯示數值:                         " + a1.doubleValue());
            System.out.println("toString方法顯示數值:                                 " + a1.toString());
            System.out.println("toPlainString方法顯示數值:                    " + a1.toPlainString());
        }
        System.out.println("\n\n");
        // 小數位、整數位同時遞增
        a1 = new BigDecimal("1");
        for (int i = 1; i < 30; i++) {
            if (i % 2 == 0) {
                a1 = a1.multiply(new BigDecimal("10"));
            } else {
                a1 = a1.multiply(new BigDecimal("10.1"));
            }
            System.out.println(
                    "----------------------" + (i + 1) + "位整數," + ((i + 1) / 2) + "位小數時的輸出結果-------------------------");
            System.out.println("doubleValue方法顯示數值:                         " + a1.doubleValue());
            System.out.println("toString方法顯示數值:                                 " + a1.toString());
            System.out.println("toPlainString方法顯示數值:                    " + a1.toPlainString());
        }
    }
}
           

運作結果如下:

87_BigDecimal的doubleValue()、toString()、toPlainString()與科學計數法

4位小數時,doubleValue()顯示變為科學計數法。7位小數時,toString()變為科學計數法。toPlainString()始終無變化。

87_BigDecimal的doubleValue()、toString()、toPlainString()與科學計數法
87_BigDecimal的doubleValue()、toString()、toPlainString()與科學計數法

8位整數時,doubleValue()顯示變為科學計數法。

87_BigDecimal的doubleValue()、toString()、toPlainString()與科學計數法
87_BigDecimal的doubleValue()、toString()、toPlainString()與科學計數法

當整數、小數位數皆增長時,doubleValue()變為科學計數法,其他兩種方法不變。

由以上測試,得出結論,toString()在某些情況下顯示數值會變為科學計數法,而toPlainString()始終精确顯示數值本身。

原文:https://blog.csdn.net/u013742303/article/details/80591187