69

BigDecimalオブジェクトがあり、それを文字列に変換したいと思います。問題は、値が分数になり、(長さが)膨大な数になり、文字列の元の数だけが必要になることです。たとえば、次のようになります。

BigDecimal bd = new BigDecimal(10.0001)
System.out.println(bd.toString());
System.out.println(bd.toPlainString());

出力は次のとおりです。

10.000099999999999766941982670687139034271240234375
10.000099999999999766941982670687139034271240234375

そして私は出力が10.0001文字列の正確な数である必要があります

4

8 に答える 8

132

正確に取得10.0001するには、StringコンストラクターまたはvalueOf(doubleの正規表現に基づいてBigDecimalを構築する)を使用する必要があります。

BigDecimal bd = new BigDecimal("10.0001");
System.out.println(bd.toString()); // prints 10.0001
//or alternatively
BigDecimal bd = BigDecimal.valueOf(10.0001);
System.out.println(bd.toString()); // prints 10.0001

の問題new BigDecimal(10.0001)は、引数がaであり、doubleが正確にdouble表すことができない場合があることです。10.0001つまり10.0001、可能な限り最も近いダブルに「変換」されます。これが10.000099999999999766941982670687139034271240234375、あなたBigDecimalが示していることです。

そのため、doubleコンストラクターを使用することはほとんど意味がありません。

あなたはここでそれについてもっと読むことができます、小数点以下の桁を2倍に移動する

于 2012-12-16T09:57:32.210 に答える
13

で初期化したためBigDecimal、番号が含まれていません。また想定した番号が含まれていませんでした。(これが全体のポイントです。)10.0001doubledoubleBigDecimal

代わりに文字列ベースのコンストラクターを使用する場合:

BigDecimal bd = new BigDecimal("10.0001");

...その後、実際には期待する数が含まれます。

于 2012-12-16T09:58:45.013 に答える
9

さまざまなロケールをより適切にサポートするには、次のように使用します。

DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(0);
df.setGroupingUsed(false);

df.format(bigDecimal);

また、それをカスタマイズすることができます:

DecimalFormat df = new DecimalFormat("###,###,###");
df.format(bigDecimal);
于 2016-07-12T08:46:57.867 に答える
8

以下のメソッドを使用すると、java.math.BigDecimalをStringに変換できます。

   BigDecimal bigDecimal = new BigDecimal("10.0001");
   String bigDecimalString = String.valueOf(bigDecimal.doubleValue());
   System.out.println("bigDecimal value in String: "+bigDecimalString);

出力:
文字列のbigDecimal値:10.0001

于 2014-06-13T18:07:04.890 に答える
1
// Convert BigDecimal number To String by using below method //

public static String RemoveTrailingZeros(BigDecimal tempDecimal)
{
    tempDecimal = tempDecimal.stripTrailingZeros();
    String tempString = tempDecimal.toPlainString();
    return tempString;
}

// Recall RemoveTrailingZeros
BigDecimal output = new BigDecimal(0);
String str = RemoveTrailingZeros(output);
于 2014-06-28T13:44:52.213 に答える
0

BigDecimalをdoubleにすることはできません。Int番号を使用できます。正確に独自の数値を表示する場合は、BigDecimalのStringコンストラクターを使用できます。

このような:

BigDecimal bd1 = new BigDecimal("10.0001");

これで、bd1を10.0001として表示できます。

とても簡単。幸運を。

于 2012-12-21T15:19:25.210 に答える
0

必要な結果をdoubleコンストラクターでアーカイブするには、BigDecimalを文字列に変換する前に丸める必要があります。

new java.math.BigDecimal(10.0001).round(new java.math.MathContext(6、java.math.RoundingMode.HALF_UP))。toString()

「10.0001」を印刷します

于 2016-04-18T13:28:45.667 に答える
0

精度の量を設定して値を丸める必要がある場合、これを行う正しい方法は、独自のオブジェクトを使用することです。

BigDecimal value = new BigDecimal("10.0001");
value = value.setScale(4, RoundingMode.HALF_UP);
System.out.println(value); //the return should be "10.0001"

指向オブジェクトプログラミング(OOP)の柱の1つは「カプセル化」です。この柱は、オブジェクトが次のように独自の操作を処理する必要があることも示しています。

于 2019-05-10T15:49:43.193 に答える