私はお金を使って作業しているので、結果を正確にする必要がありますが、必要なのは小数点以下2桁(セント)だけです。乗算/除算の結果が正確であることを保証するためにBigDecimalは必要ですか?
5 に答える
BigDecimalは、小数点以下の既知の桁数を持つ小数演算に非常に適したタイプです。整数型を使用して乗数を自分で追跡できますが、これには自動化できるコード作業を行う必要があります。
BigDecimalは、小数点以下の桁を管理するだけでなく、必要に応じて格納される桁数を拡張します。多くの企業および政府の財務計算では、合計が大きすぎてintにセントで格納できません。
非常に大量のお金を保管する必要があり、メモリが不足している場合にのみ、これを回避することを検討します。
一般的なオプションの1つは、すべての計算を整数またはlong(セント値)で実行し、表示する必要がある場合は小数点以下2桁を追加することです。
同様に、お金の計算のためのよりフル機能のAPIを提供するJODAMoneyライブラリがあります。
アプリケーションによって異なります。このレベルの精度を使用する理由の1つは、多くの操作で蓄積されたエラーが浸透して貴重な情報が失われるのを防ぐためです。カジュアルなアプリケーションを作成している場合や、データ入力などにのみ使用している場合、BigDecimalはやり過ぎである可能性が非常に高くなります。
パトリシアスの答えは+1ですが、誰かがあなたが何をしているのか本当にわからない限り、固定ビット長の整数データ型で独自のクラスを実装することは強くお勧めしません。BigDecimalはすべての丸めと精度の問題をサポートしますが、long/intには重大な問題があります。
不明な小数桁数:貿易取引所/法律/商取引では小数桁数が異なるため、選択した桁数を将来変更および調整する必要があるかどうかはわかりません。さらに悪いことに、株式評価のように、ばかげた量の小数桁が必要なものがあります。1000メートルトンの石炭を積んだ船は、たとえば4,12ユーロの氷のコストを引き起こし、0,000412ユーロ/トンになります。
実装されていない演算:これは、人々が丸め/除算またはその他の算術演算に浮動小数点を使用する可能性が高く、不正確さを隠し、浮動小数点演算のすべての既知の問題を引き起こす可能性があることを意味します。
オーバーフロー/アンダーフロー:最大量に達した後、量を追加すると符号が変更されます。Long.MAX_VALUEはLong.MIN_VALUEに切り替わります。これは、(a * b * c * d)/(e * f)のような分数を実行している場合に簡単に発生する可能性があります。これは、長い範囲で完全に有効な結果になる可能性がありますが、中間の分母または分母はそうではありません。
金額を保持するためにCurrency
を使用して、独自のクラスを作成できます。long
クラスメソッドは、を使用して金額を設定および取得しString
ます。
long
を使用するか、を使用するかに関係なく、分割が問題になりますBigDecimal
。端数セントで何をするかは、ケースバイケースで決定する必要があります。それらを破棄するか、丸めるか、または保存します(自分のアカウント以外の場所)。