web-dev-qa-db-ja.com

javaで文字列をBigDecimalに変換します

XMLからJavaに通貨を読み込んでいます。

String currency = 135.69;

これをBigDecimalに変換すると、次のようになります。

 System.out.println(new BigDecimal(135.69));

出力:

135.68999999999999772626324556767940521240234375.

なぜこれほど多くの数字を出力するのですか?どうすればこれを回避できますか?欲しいのは、135.69を出力することだけです。

33
Hari Rao

BigDecimal(double)コンストラクターにはいくつかの問題があるため、BigDecimal(String)またはBigDecimal.valueOf(double)を使用することをお勧めします。

System.out.println(new BigDecimal(135.69)); //135.68999999999999772626324556767940521240234375
System.out.println(new BigDecimal("135.69")); // 135.69
System.out.println(BigDecimal.valueOf(135.69)); // 135.69

BigDecimal(double)ドキュメントでは、この動作について説明しています。

  1. このコンストラクタの結果は、いくぶん予測不能です。 Javaに新しいBigDecimal(0.1)を書き込むと、0.1(スケールなしの値1、スケール1)に完全に等しいBigDecimalが作成されますが、実際には0.1000000000000000055511151231257827021181583404541015625に等しくなります。これは、0.1をdoubleとして正確に表現できないためです(つまり、有限長の2進小数として表現することはできません)。したがって、コンストラクターに渡される値は、外観にかかわらず、0.1に正確には等しくありません。
  2. 一方、Stringコンストラクターは完全に予測可能です。新しいBigDecimal( "0.1")を記述すると、予想どおり0.1に等しいBigDecimalが作成されます。したがって、一般に、このコンストラクタよりもStringコンストラクタを使用することをお勧めします。
  3. DoubleをBigDecimalのソースとして使用する必要がある場合、このコンストラクターが正確な変換を提供することに注意してください。 Double.toString(double)メソッドを使用してdoubleをStringに変換してからBigDecimal(String)コンストラクターを使用した場合と同じ結果にはなりません。その結果を取得するには、静的なvalueOf(double)メソッドを使用します。
73
Marlon Patrick
String currency = "135.69";
System.out.println(new BigDecimal(currency));

//will print 135.69
22

何か追加してもいいですか。通貨を使用している場合は、Scale(2)を使用する必要があり、おそらくラウンド方法を理解する必要があります。

2
Juan Diego

135.69を通貨の文字列として保存しています。しかし、可変通貨を渡す代わりに、再び135.69(double value)を新しいBigDecimal()に渡します。したがって、出力には多くの数字が表示されています。通貨変数を渡すと、出力は135.69になります

2
sandeep

こんにちは、文字列を直接bigdecimalに変換することはできません

あなたは最初にそれを長いに変換する必要があります

文字列通貨= "135.69"; Long rate1 = Long.valueOf((currency));

    System.out.println(BigDecimal.valueOf(rate1));
0