8

「10364055.81」のような10進数を表すのに適したデータ型。

doubleを使用してみた場合:

double d = 10364055.81;

しかし、番号を印刷しようとすると、「1.036405581E7」と表示されますが、これは望ましくありません。

BigDecimalを使用する必要がありますか?ただし、10364055.81000000052154064178466796875と表示されます。値をそのまま表示するデータ型はありますか?また、その数は例として取り上げたものよりも大きい場合があります。

ところで、BigDecimalを使用すると、アプリケーションのパフォーマンスに影響しますか?ほとんどすべてのDTOでこれを使用する可能性があります。

4

4 に答える 4

19

BigDecimalを使用する必要がありますが、Stringコンストラクターを使用してください。例:

new BigDecimal("10364055.81");

をBigDecimalに渡す場合double、Javaは最初にそのdo​​ubleを作成する必要があります。また、doubleはほとんどの小数を正確に表すことができないため、値をasとして作成してから、BigDecimalコンストラクターに渡し10364055.81000000052154064178466796875ますこの場合、BigDecimalには、実際に丸みを帯びたバージョンを意味していることを知る方法がありません。

一般的に、BigDecimalの非文字列コンストラクターを使用することは、クラスの利点を十分に活用していないことを警告するものと見なす必要があります。

編集-あなたがやりたかったことを正確に読み直すことに基づいて、私の最初の主張はおそらく強すぎます。BigDecimalは、10進値を正確に表す必要がある場合に適しています(たとえば、お金の処理が当然の選択であり、5.99*100万になることは望ましくありません5990016.45

ただし、入力した10進リテラルとはわずかに異なる値として内部に格納されている数値を気にせず、同じ形式で再度出力したい場合は、他の人が言っているように、 NumberFormat(この場合、new DecimalFormat("########.##"))はdoubleをうまく出力するためのトリックを実行します。そうでない場合、 String.formatはほとんど同じことを実行できます。

パフォーマンスに関しては、BigDecimalsはプリミティブを使用するよりも当然遅くなります。ただし、通常、プログラムの大部分に数学的な操作が含まれていない限り、実際に速度の違いに気付くことはほとんどありません。だからといって、BigDecimalsをあちこちで使用する必要があるというわけではありません。むしろ、プレーンdoublesでは実現が困難または不可能な機能から真のメリットを得ることができるのであれば、理論的に導入されるわずかなパフォーマンスの違いに汗を流さないでください。

于 2009-10-22T09:04:02.793 に答える
4

番号の表示方法は、番号の保存方法とは異なります。

ダブル(またはフロートなど)のときに数値を表示する方法を制御するには、 DecimalFormatを参照してください。

ダブルではなくBigDecimalを選択する(またはその逆)には長所と短所があり、要件によって異なることに注意してください。詳細については、こちらをご覧ください。要約から:

要約すると、生のパフォーマンスとスペースが最も重要な要素である場合、プリミティブ浮動小数点型が適切です。10進値を正確に表す必要がある場合、高精度の計算が必要な場合、または丸めの微調整が必​​要な場合は、BigDecimalだけが必要な機能を備えています。

于 2009-10-22T09:03:58.197 に答える
1

この数を節約するには、doubleで十分です。印刷したり文字列に入れたりするときにフォーマットが気に入らないことが問題である場合は、NumberFormatを使用できます:http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html

于 2009-10-22T09:05:40.750 に答える
1

System.out.printf()を使用する場合は、doubleとdisplayを使用できます。

double d = 100003.81;
System.out.printf("%.10f", d);

.10f-精度が10のdoubleを意味します

于 2009-10-22T09:09:31.473 に答える