C#でお金に使用するのに最適なデータ型は何ですか?
10進数 で記述されているように、
Decimalキーワードは、128ビットのデータ型を示します。浮動小数点型と比較して、decimal型はより精度が高く、範囲が狭いため、は財務および通貨の計算に適しています。
次のように小数点を使用できます。
decimal myMoney = 300.5m;
Decimal値型は、正の79,228,162,514,264,337,593,543,543,950,335から負の79,228,162,514,264,337,593,543,950,335までの範囲の10進数を表します。 Decimal値タイプは、有効数字および小数桁数が多く、丸め誤差がない必要がある財務計算に適しています。 Decimal型は丸めの必要性を排除しません。むしろ、丸めによる誤差を最小限に抑えます。
私は この優れた答え をなぜdoubleを使うべきでないのかについてzneakで指摘したいのですが。
エンタープライズアプリケーションアーキテクチャのパターン から Moneyパターン を使用します。金額を小数として、通貨を列挙として指定します。
10進数二重を選択した場合、丸め誤差に気を配ったままにします。
decimalの範囲は狭くなりますが、精度は上がります。つまり、時間の経過とともにこれらのペニーをすべて失うことはありません。
詳細はこちら:
お金のパターンに同意してください:あなたが小数を使うとき、通貨を扱うことはちょっと面倒すぎます。
Currencyクラスを作成すれば、正しいToString()メソッド、解析値の制御の強化、部門の制御の改善など、お金に関するすべてのロジックをそこに含めることができます。
また、Currencyクラスでは、意図せずに他のデータとお金が混同される可能性はありません。
もう一つの選択肢は(特にあなたがクラスを所有しているのなら)intかint64を使い、 "小数点の右側"として下位4桁(あるいはおそらく2)を指定することです。そのため、 "端に"いくらかの "* 10000"と途中に "/ 10000"が必要です。これは、MicrosoftのSQL Serverで使用されているストレージメカニズムです。 http://msdn.Microsoft.com/ja-jp/library/ms179882.aspx を参照してください。
これの本質は、あなたのすべての合計が(速い)整数算術を使って行われることができるということです。
私が使ったほとんどのアプリケーションはお金を表すためにdecimal
を使います。これは、アプリケーションが複数の通貨に関係することは決してないという仮定に基づいています。
この仮定は、アプリケーションが通貨の異なる他の国では決して使用されないという別の仮定に基づいている可能性があります。私はそれが間違っていることが判明した事例を見ました。
今、その仮定は新しい方法で挑戦されています:Bitcoinのような新しい通貨はより一般的になっています、そして、それらはどんな国に特定でもありません。 1カ国だけで使用されているアプリケーションが複数の通貨をサポートする必要があるかもしれないことは現実的ではありません。
お金のためだけに型を作成したり使用したりすることは、「金メッキ」、または既知の要件を超えた余分な複雑さの追加であると言う人もいます。私は強く反対します。あなたのドメイン内でより普遍的な概念があるほど、正しい抽象化を前もって使用するために合理的な努力をすることがより重要です。複雑さを見たい場合は、decimal
を使用していたアプリケーションで作業してみてください。今すぐすべてのCurrency
プロパティの横に追加のdecimal
プロパティがあります。
前もって間違った抽象化を使用した場合、後でそれを置き換えることは、100倍以上の作業になります。それは潜在的に既存のコードに欠陥を導入することを意味します、そして最も良い部分はそれらの欠陥が多額のお金、お金との取引、または単にお金との何かを含むであろうということです。
そして、10進以外の何かを使うのはそれほど難しくありません。グーグルの "儲けのない金型"なら、あなたは多くの開発者がそのような抽象概念を作成していることに気付くでしょう。 DateTime
に日付を格納する代わりにstring
を使うのと同じくらい簡単です。
あなた自身のクラスを作成してください。これは奇妙に思えますが、.Netタイプは異なる通貨をカバーするには不十分です。