爲什麼此代碼有時會返回1E + 1而其他輸入(例如17)輸出不是以科學記數法打印?爲什麼Java BigDecimal返回1E + 1?
BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);
爲什麼此代碼有時會返回1E + 1而其他輸入(例如17)輸出不是以科學記數法打印?爲什麼Java BigDecimal返回1E + 1?
BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);
BigDecimal bigDecimal = BigDecimal.valueOf(100000.0)
.multiply(BigDecimal.valueOf(100d))
.stripTrailingZeros();
System.out.println("plain : " + bigDecimal.toPlainString());
System.out.println("scientific : " + bigDecimal.toEngineeringString());
輸出:
plain : 10000000 scientific : 10E+6
用於BigDecimal.toString()
行爲的確切理由在API doc在大(和近難以理解)詳細地解釋。
要獲得一致的(和語言環境敏感的)文本表示形式,應該使用DecimalFormat。
這基本上是因爲你沒有足夠的有效數字。如果你將只有1個有效數字的東西乘以100,那麼你只能得到1個有效數字。如果它顯示「10」,那麼基本上說它有2位有效數字。顯示它的方式只有1個有效數字是顯示「1 x 10^1」。
下面的兩個小數具有相同的值(10),但不同的「尺度」(其中它們開始計數顯著數字;頂部具有2個SIG無花果,底部具有:1):
System.out.println(new BigDecimal(BigInteger.TEN, 0)); // prints 10
System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1
+1提供一個實際的解決方案,而不是像我這樣的「這就是問題」。 :) – 2009-05-29 10:01:19