XML
からJavaに通貨を読み込んでいます。
String currency = 135.69;
これをBigDecimal
に変換すると、次のようになります。
System.out.println(new BigDecimal(135.69));
出力:
135.68999999999999772626324556767940521240234375.
なぜこれほど多くの数字を出力するのですか?どうすればこれを回避できますか?欲しいのは、135.69を出力することだけです。
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)ドキュメントでは、この動作について説明しています。
- このコンストラクタの結果は、いくぶん予測不能です。 Javaに新しいBigDecimal(0.1)を書き込むと、0.1(スケールなしの値1、スケール1)に完全に等しいBigDecimalが作成されますが、実際には0.1000000000000000055511151231257827021181583404541015625に等しくなります。これは、0.1をdoubleとして正確に表現できないためです(つまり、有限長の2進小数として表現することはできません)。したがって、コンストラクターに渡される値は、外観にかかわらず、0.1に正確には等しくありません。
- 一方、Stringコンストラクターは完全に予測可能です。新しいBigDecimal( "0.1")を記述すると、予想どおり0.1に等しいBigDecimalが作成されます。したがって、一般に、このコンストラクタよりもStringコンストラクタを使用することをお勧めします。
- DoubleをBigDecimalのソースとして使用する必要がある場合、このコンストラクターが正確な変換を提供することに注意してください。 Double.toString(double)メソッドを使用してdoubleをStringに変換してからBigDecimal(String)コンストラクターを使用した場合と同じ結果にはなりません。その結果を取得するには、静的なvalueOf(double)メソッドを使用します。
String currency = "135.69";
System.out.println(new BigDecimal(currency));
//will print 135.69
何か追加してもいいですか。通貨を使用している場合は、Scale(2)を使用する必要があり、おそらくラウンド方法を理解する必要があります。
135.69を通貨の文字列として保存しています。しかし、可変通貨を渡す代わりに、再び135.69(double value)を新しいBigDecimal()に渡します。したがって、出力には多くの数字が表示されています。通貨変数を渡すと、出力は135.69になります
こんにちは、文字列を直接bigdecimalに変換することはできません
あなたは最初にそれを長いに変換する必要があります
文字列通貨= "135.69"; Long rate1 = Long.valueOf((currency));
System.out.println(BigDecimal.valueOf(rate1));