主題: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());
}
}
}
運作結果如下:

4位小數時,doubleValue()顯示變為科學計數法。7位小數時,toString()變為科學計數法。toPlainString()始終無變化。
8位整數時,doubleValue()顯示變為科學計數法。
當整數、小數位數皆增長時,doubleValue()變為科學計數法,其他兩種方法不變。
由以上測試,得出結論,toString()在某些情況下顯示數值會變為科學計數法,而toPlainString()始終精确顯示數值本身。
原文:https://blog.csdn.net/u013742303/article/details/80591187