質問
「10364055.81」のような 10 進数を表すのに適したデータ型はどれですか。
double を使用しようとすると:
double d = 10364055.81;
しかし、番号を印刷しようとすると、「」と表示されます。1.036405581E7」、それは望んでいません。
BigDecimal を使用する必要がありますか?しかし、それは次のように表示されます 10364055.81000000052154064178466796875。値をそのまま表示するデータ型はありますか?また、数値は例として挙げたものより大きくなる場合があります。
ところで、BigDecimal を使用するとアプリケーションのパフォーマンスに影響しますか??ほぼすべての DTO でこれを使用する可能性があります。
解決
BigDecimal を使用する必要がありますが、 String コンストラクターを使用する, 例:
new BigDecimal("10364055.81");
合格した場合 double
BigDecimal に変換するには、Java は最初にその double を作成する必要があります。double はほとんどの小数を正確に表現できないため、 する として値を作成します 10364055.81000000052154064178466796875
そして それから それを BigDecimal コンストラクターに渡します。この場合、BigDecimal には、実際に丸いバージョンを意味しているかどうかを知る方法がありません。
一般に、BigDecimal の非 String コンストラクターを使用することは、クラスの利点を最大限に活用していないという警告であると考える必要があります。
編集 - あなたがやりたかったことを正確に読み直したことに基づくと、私の最初の主張はおそらく強すぎます。BigDecimal は、10 進数値を正確に表す必要がある場合に適しています (お金の処理が当然の選択であり、5.99 * 100 万を表現したくない場合) 5990016.45
例えば。
ただし、番号が保存されることを気にしない場合は、 内部的に 入力した10進リテラルとは非常にわずかに異なる値として、それを同じ形式で再度出力したいだけの場合、他の人が言ったように、のインスタンス NumberFormat
(この場合、 new DecimalFormat("########.##")
) double をうまく出力するトリックを実行します。または 文字列.形式 ほぼ同じことができます。
パフォーマンスに関しては、BigDecimal はプリミティブを使用するよりも当然遅くなります。ただし、通常は、プログラムの大部分に数学的操作が含まれていない限り、実際に速度の違いに気づくことはほとんどありません。だからといって、BigDecimal を全面的に使用すべきだというわけではありません。むしろ、単純な方法では実現が困難または不可能な機能から真の利益を得ることができれば、ということです。 doubles
, なら、理論的に導入されるごくわずかなパフォーマンスの違いを気にする必要はありません。
他のヒント
数字の表示方法は、数字の保存方法と異なる。
DecimalFormat をご覧くださいa> double(またはfloatなど)の場合の数値の表示方法を制御します。
DoubleではなくBigDecimalを選択する(またはその逆)ことには賛否両論があり、要件に依存することに注意してください。 を参照してください。詳細はこちらをご覧ください。概要から:
要約すると、生のパフォーマンスと スペースは最も重要な要素であり、 プリミティブな浮動小数点型は 適切な。小数値が必要な場合 正確に表現され、高精度 計算が必要、または微調整 丸めが望ましい BigDecimalには必要なものがあります 機能。
この数値を保存するには、ダブルで十分です。あなたの問題が、文字列に印刷したり、文字列に入れたりするときの形式が気に入らない場合は、NumberFormatを使用できます: http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html
System.out.printf()を使用すると、doubleとdisplay ifを使用できます。
double d = 100003.81;
System.out.printf("%.10f", d);
.10f-精度が10のdoubleを意味します