2009-05-29 438 views
23

爲什麼此代碼有時會返回1E + 1而其他輸入(例如17)輸出不是以科學記數法打印?爲什麼Java BigDecimal返回1E + 1?

BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros(); 
System.out.println("value: " + bigDecimal); 

回答

39

使用bigDecimal.toPlainString()

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 
+0

+1提供一個實際的解決方案,而不是像我這樣的「這就是問題」。 :) – 2009-05-29 10:01:19

7

這是隱式轉換.toString()傳遞時,結果爲System.out.println()正在發生。

+0

+1指向問題 – dfa 2009-05-29 10:03:17

3

用於BigDecimal.toString()行爲的確切理由在API doc在大(和近難以理解)詳細地解釋。

要獲得一致的(和語言環境敏感的)文本表示形式,應該使用DecimalFormat

3

這基本上是因爲你沒有足夠的有效數字。如果你將只有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