web-dev-qa-db-ja.com

BigDecimalが通貨に最適なデータタイプである理由

私は この質問 を読んでいて、受け入れられた答えはBigDecimalが通貨の値を表すのに最適なタイプであると言っています。大きな小数点の使用をサポートする他のいくつかの質問も見ました。

なぜBigDecimalが最良のタイプなのですか?正確な計算や純資産の大きい人などの議論の関連性がわかりません。小数点第10位に四捨五入する通貨はなく、8バイトに相当する金額を持っている人はほとんどいないと思います(それをlongとして保存する場合)。

税金やその他の中間計算については、値を早めに丸めたり切り捨てたりしない適切なタイプを使用していることを確認することが重要であることがわかります。ドルは私にはそれほど大きくないようです。

それは、財務諸表に関して正確さの重要性を理解していないためかもしれません。おそらく、100万分の1セントが最終的な数値として重要であるかどうかを誰かが明確にすることもできます。

11
MxLDevs

それはすべて精度に帰着し、Javaの BigDecimal は正解のようですそのプラットフォーム上可変精度になる可能性のあるものを指定および保持するための最良のサポートを提供するためです。

100万分の1セントはたった10です-5 支払額の変動から、そしてその精度のレベルが重要である状況を思いつくことはそれほど難しくありません。

  1. A社は5千万(5x106)発行済み株式と現在の価格は10ドルです。
  2. 人物Bは、ブローカーを通じて会社Aの1ドルを購入します。彼らは現在、10分の1のシェア、またはA社の5億分の1を所有しています。(10-7)。
  3. 会社Aは不当に過大評価されており、スキャンダルが少し発生した後、会社Cによる株式交換の購入を1,000ドル(10)、各株主は同等の数を受け取り、現金または株式のいずれかで株主に均等に支払われます。
  4. 人物Bはどれくらいの現金または株を手に入れることができますか?番号を間違えた場合、B氏(たまたま30代で失業中の弁護士)が取引全体を台無しにして、失った価値と法的費用を訴えて給料を受け取る可能性があることに注意してください。

さて、評価はわざとかなりばかげていますが、数値が非常に小さいオフであっても、同じ「正しくする必要があるか、または爆発する」同じ詳細です。

11
DougM

通貨の値を表す正しいタイプは、アプリケーションによって異なります。

2つのもっともらしい選択は、正確な算術が可能なタイプまたは浮動小数点タイプです。次の2つの事実を覚えておいてください。

  1. 浮動小数点演算では、通常の代数的恒等式(可換性や結合性など)は保持されなくなります。彼らはまだ正確な算術を保持します。

  2. 正確な算術では、多項式以外の関数を処理することはできないため、平方根や指数関数を使用することはできません。浮動小数点演算では、それらを使用できます。

ダブルアカウンティング パーソナルファイナンスソフトウェアでは、正確な計算が望ましいです。記録されたすべてのキャッシュフローは合計でゼロになると予想されます。これは代数的同一性であるため、正確な算術演算を使用する場合にのみ検証できます。ここで浮動小数点を使用すると、二重会計の原則全体が役に立たなくなります。

手形交換所が使用する内部ソフトウェアでは、基本的に以前と同じ理由で、正確な計算も必須です。保全の原則があるため、キャッシュフローは常にゼロになるはずです。プログラムは代数的性質の不変量を満たさなければならないので、正確な算術に依存しなければなりません。

数学的ファイナンス のメソッドを実装する価格設定またはリスク管理ソフトウェアでは、物理シミュレーションの再考を伴う複雑な計算が実行され、期待値が計算されます。この問題の本質は、浮動小数点数の使用を必要とします。

7
user40989

あなたがあなたの質問にいないので、私はここで仮定をするつもりです。なぜBigdecimalが最高なのですか?それは代替案よりも優れているからです。

BigdecimalがFloatより優れているのはなぜですか?

フロートでは、10進0.1のような値を正確に保持できないためです。 10進数0.1の2進数表現は次のようになります。2進数0.00011001100110011001100110011001これを10進数に戻すと、0.0999999998603016138になります。

ここで、0.1以上の条件をチェックして、失敗することを確認したい......

4
Pieter B