BigDecimalを使用する必要がありますが、Stringコンストラクターを使用してください。例:
new BigDecimal("10364055.81");
をBigDecimalに渡す場合double
、Javaは最初にそのdoubleを作成する必要があります。また、doubleはほとんどの小数を正確に表すことができないため、値をasとして作成してから、BigDecimalコンストラクターに渡し10364055.81000000052154064178466796875
ます。この場合、BigDecimalには、実際に丸みを帯びたバージョンを意味していることを知る方法がありません。
一般的に、BigDecimalの非文字列コンストラクターを使用することは、クラスの利点を十分に活用していないことを警告するものと見なす必要があります。
編集-あなたがやりたかったことを正確に読み直すことに基づいて、私の最初の主張はおそらく強すぎます。BigDecimalは、10進値を正確に表す必要がある場合に適しています(たとえば、お金の処理が当然の選択であり、5.99*100万になることは望ましくありません5990016.45
。
ただし、入力した10進リテラルとはわずかに異なる値として内部に格納されている数値を気にせず、同じ形式で再度出力したい場合は、他の人が言っているように、 NumberFormat
(この場合、new DecimalFormat("########.##")
)はdoubleをうまく出力するためのトリックを実行します。そうでない場合、 String.formatはほとんど同じことを実行できます。
パフォーマンスに関しては、BigDecimalsはプリミティブを使用するよりも当然遅くなります。ただし、通常、プログラムの大部分に数学的な操作が含まれていない限り、実際に速度の違いに気付くことはほとんどありません。だからといって、BigDecimalsをあちこちで使用する必要があるというわけではありません。むしろ、プレーンdoubles
では実現が困難または不可能な機能から真のメリットを得ることができるのであれば、理論的に導入されるわずかなパフォーマンスの違いに汗を流さないでください。