web-dev-qa-db-ja.com

Java NumberをBigDecimalに変換する:最適な方法

NumberをBigDecimalに変換する最良の方法を探しています。

これで十分ですか?

Number number;
BigDecimal big = new BigDecimal(number.toString());

toString()メソッドで精度を失うことはありますか?

52
user1721413

これは問題ありません。BigDecimalのコンストラクターを使用して値を宣言すると、String型ではない場合に危険になる可能性があることに注意してください。以下を考慮してください...

BigDecimal valDouble = new BigDecimal(0.35);
System.out.println(valDouble);

これは0.35を印刷せず、実際には...

0.34999999999999997779553950749686919152736663818359375

そのため、おそらくあなたのソリューションが最も安全だと思います。

34
david99world

ToString()メソッドで精度を失うことはありますか?

種類... Float.toString()Double.toString()は両方とも、小数点以下の桁数のみを出力します。これは、出力がfloatまたはdouble値に一意に対応するために必要です。

David99worldの答えで0.35の例を使用するには、次のコードを検討してください。

BigDecimal bd1 = new BigDecimal(0.35);

Number n = 0.35;
BigDecimal bd2 = new BigDecimal(n.toString());

System.out.println(bd1);
System.out.println(bd2);

直感的な予想では、2つのBigDecimalインスタンスは同一であるかもしれませんが、出力は以下のようになっていることを示しています。

0.34999999999999997779553950749686919152736663818359375
0.35

0.35は正確に表現できないため、最初の行はdoubleの正確な値です。 2番目の行は0.35です。これは、個別の値を表すために小数桁が必要ないためです。例えば。ステートメント0.34999999999999997779553950749686919152736663818359375 == 0.35trueに評価されます。

これは、実際にはBigDecimalを作成する際の精度の低下ではなく、「ソース」値に不確実性が既に存在します。問題はむしろ、例えばソースとしてのfloat値またはdouble値は、BigDecimalインスタンスの正確な同等物で表されるとは限りません。

19
jarnbjo

最良の方法は

BigDecimal.valueOf(myDouble);

内部的には同じですが、longsに対しても機能するオーバーロード関数であり、頻繁に使用されるlongs値に対して最適化されています。そのため、より標準的で、シンプルで覚えやすいです。

ソース

0
Marco Sulla