29

このコードが時々 1E+1 を返すのに、他の入力 (例: 17) の出力が科学表記法で出力されないのはなぜですか?

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

4 に答える 4

48

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());

出力:

無地:10000000
科学的: 10E+6
于 2009-05-29T09:55:05.113 に答える
8

.toString()結果を に渡すときに発生するのは、暗黙的な変換ですSystem.out.println()

于 2009-05-29T09:54:49.933 に答える
3

これは基本的に、有効数字が足りないためです。有効数字が1桁しかないものに100を掛けると、有効数字が1桁しかないものになります。「10」と表示されている場合は、基本的に有効数字が2桁であることを示しています。有効数字が1桁しかないことを示す方法は、「1 x 10^1」を表示することです。

次の2つの小数は同じ値(10)ですが、「スケール」が異なります(有効数字のカウントを開始します。上部には有効数字が2つ、下部には1があります)。

System.out.println(new BigDecimal(BigInteger.TEN, 0));  // prints 10
System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1
于 2009-05-29T10:48:32.663 に答える
3

の動作の正確な根拠はBigDecimal.toString()API docで非常に (そしてほとんど理解できない) 詳細に説明されています。

一貫した (ロケールに依存した) テキスト表現を得るには、DecimalFormatを使用する必要があります。

于 2009-05-29T10:01:05.270 に答える