web-dev-qa-db-ja.com

Javaで通貨操作に使用する丸めモードはどれですか?

Java通貨にBigDecimalを使用するサイト。) http://docs.Oracle.com/javase/tutorial/Java /nutsandbolts/datatypes.html

しかし、どの丸めモードを使用する必要がありますか?最も適切なものであり、最も広く私たち

44
Ahsan Abid

「正しい」モードはありません。ビジネスケースによって異なります。例:

  • 年次税を計算するとき、しばしば端数が切り捨てられます(RoundingMode.FLOOR)。
  • ボーナスを計算するときは、常に顧客に有利に丸めることができます(RoundingMode.CEILING)。
  • 請求書の税金については、通常HALF_UP
  • 複雑な財務シミュレーションを実行する場合、まったく丸めたくないでしょう。

RoundingModeのドキュメント には、さまざまなモードがどのように機能するかの多くの例が含まれています。

より良い答えを得るには、達成したいことを教えてください。

つまり、BigDecimalはJavaで使用する正しいタイプです。これは、精度を維持でき、さらに、ケースに最適な丸めモードを選択できるためです。

49
Aaron Digulla

ほとんどの場合、BigDecimalが通貨の唯一の有効な選択肢です。しかし、丸め戦略の選択はそれほど明白ではありません。

デフォルトは HALF_EVEN で、これが適切な選択です。このアルゴリズムはbankers 'roundingとして知られています(議論 here を参照)。

別の一般的な戦略は HALF_UP です。これはより直感的ですが、統計的特性がわずかに劣ります。

また、多くの場合(特に銀行と保険の場合)、丸め戦略はビジネス要件によって決定され、多くの場合、さまざまなユースケースで異なることに注意してください。

18

通常、次のように「ハーフアップ」丸めを使用します。

myBigDecimal.setScale(2, RoundingMode.HALF_UP);

この方法では、小数点以下2桁に丸めます(ほとんどの通貨はドルやセントを使用しますが、明らかに例外があります)。また、0.5セント以上では切り上げられるように値を丸めます。切り捨てます。詳細については、 javadoc を参照してください。

11

金融アプリケーションでは、ROUND_HALF_EVENが最も一般的な丸めモードです。そのモードはバイアスを回避します。ただし、表示にはNumberFormatクラスを使用する必要があります。このクラスは、異なる通貨の金額のローカライズの問題を処理します。ただし、NumberFormatはプリミティブのみを受け入れます。したがって、倍精度への変換のわずかな精度の変更を受け入れることができる場合は、最後のものを使用してください。

4
Sqeezer