C#でお金を稼ぐのに最適なデータ型は何ですか?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/...
C#でお金を稼ぐのに最適なデータ型は何ですか?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/...
回答:
decimalキーワードは、128ビットのデータ型を示します。浮動小数点型と比較して、10進数型は精度が高く範囲が狭いため、財務 計算や通貨計算に適しています。
次のように小数を使用できます。
decimal myMoney = 300.5m;
Decimal値タイプは、正の79,228,162,514,264,337,593,543,950,335から負の79,228,162,514,264,337,593,543,950,335までの範囲の10進数を表します。Decimal値タイプは、多数の有効な整数および小数桁を必要とし、丸め誤差がない財務計算に適しています。Decimalタイプは、丸めの必要性を排除しません。むしろ、丸めによるエラーを最小限に抑えます。
なぜdoubleが使用されるべきではないのかについて、zneakによるこの素晴らしい答えを指摘したいと思います。
エンタープライズアプリケーションアーキテクチャのパターンのMoneyパターンを使用します。10進数として金額を指定し、enumとして通貨を指定します。
Money
nugetにはプロジェクトサイトへの無効なgithubリンクがあるので、ドキュメントはありませんか?
10進数。doubleを選択した場合、丸め誤差を受け入れることになります。
double
は、浮動小数点がすべての数値を正確に表すことができないため、丸めエラーを引き起こす可能性があります(たとえば、0.01は浮動小数点で正確に表現されません)。Decimal
一方、は正確に数値を表します。(トレードオフはDecimal
浮動小数点よりも範囲が狭いです)浮動小数点は*不注意な*丸め誤差(例えば0.01+0.01 != 0.02
)を与える可能性があります。Decimal
丸めエラーが発生する可能性がありますが、要求した場合のみ(たとえば、Math.Round(0.01+0.02)
ゼロを返す)
double
スケーリングとドメイン固有の丸めを適切に使用して慎重に適用すると、完全に正確になります。丸めがずさんな場合、decimal
意味的に正しくない結果が生じる可能性があります(たとえば、最も近いペニーに丸められるはずの複数の値を加算したが、実際には最初にそれらの周りにない場合)。唯一の良い点decimal
は、スケーリングが組み込まれていることです。
decimalの範囲は狭くなりますが、精度は高くなります。そのため、時間の経過とともにこれらのペニーをすべて失うことはありません。
詳細はこちら:
別のオプション(特に、独自のクラスをロールしている場合)は、intまたはint64を使用して、下4桁(または場合によっては2)を「小数点の右側」として指定することです。したがって、「端」では、途中で「* 10000」、そして途中で「/ 10000」が必要になります。これは、MicrosoftのSQL Serverで使用されるストレージメカニズムです。。http://msdn.microsoft.com/en-au/library/ms179882.aspxをください
これの素晴らしさは、すべての合計が(高速)整数演算を使用して実行できることです。
私が使用decimal
してきたほとんどのアプリケーションは、お金を表すために使用しました。これは、アプリケーションが複数の通貨に関係することは決してないという想定に基づいています。
この仮定は、アプリケーションが通貨の異なる他の国では使用されないという別の仮定に基づいている場合があります。それが誤りであることが判明した事例を見たことがあります。
今、仮定は新しい方法で挑戦されています:ビットコインなどの新しい通貨はより一般的になり、それらはどの国にも固有ではありません。1つの国でのみ使用されるアプリケーションが複数の通貨をサポートする必要がある場合があることは非現実的ではありません。
一部の人々は、お金のためだけにタイプを作成または使用することも「金メッキ」である、または既知の要件を超える複雑さを追加すると言います。私は強く反対します。ドメイン内の概念がユビキタスであるほど、正しい抽象化を前もって使用するための合理的な努力をすることがより重要です。複雑さを確認したい場合は、以前は使用していたアプリケーションで作業してみてください。すべてのプロパティの横にdecimal
追加のCurrency
プロパティがありdecimal
ます。
間違った抽象化を最初に使用すると、後でそれを置き換えるのに100倍の手間がかかります。つまり、既存のコードに欠陥が潜在的に導入されることを意味します。最良の部分は、これらの欠陥には、金額、金額を伴うトランザクション、または金額を伴うあらゆるものが含まれる可能性が高いことです。
そして、10進数以外のものを使用することはそれほど難しくありません。グーグルは「お金を稼ぐタイプ」であり、多数の開発者がそのような抽象化を作成していることがわかります(私を含めて)。それは簡単です。DateTime
日付をに保存する代わりに、を使用するのと同じくらい簡単string
です。