2009-03-01 16 views
9

金額を保存するために使用されている特定のデータ型の危険に関する記事をいくつか読んだ。残念ながら、いくつかのコンセプトは私の快適ゾーンにはありません。C#で金額を処理するためのベストプラクティス

これらの記事を読んで、C#でお金を使って作業するためのベストプラクティスと推奨事項は何ですか?少量のデータ型と大量のデータ型を使用する必要がありますか?また、私は英国に拠点を置いています(つまり、4,000ポンド、他の文化は同じ金額を表しています)。

答えて

8

丸め誤差のために浮動小数点数を使用しないでください。小数の型はあなたに合っているはずです。

+0

誰かがこれを理由に投票した理由を知りたいと思っています。 –

+0

私はダウン投票を相殺するために投票しました。私は下の投票はコメントなしで許されるべきだとは思わない。 –

2

金額オブジェクト(decimal)と通貨の両方を保持するために値オブジェクトを使用します。これにより、異なる通貨で同時に作業することができます。 decimalはお金のための推奨データ型です.NETで。

16

小数は、金額にとって最も分かりやすいタイプです。

10進数は、小数点以下28桁の精度を持つ浮動小数点数10の数値型です。 Decimalを使用すると、ベース2のDoubleタイプを使用する場合よりも驚きが少なくなります。

doubleは、多くの一般的な浮動小数点演算のCPUハードウェアのために、DecimalとDoubleと比べて半分のメモリを使用しますが、ほとんどの基本10分数(1.05など)を正確に表すことはできません。 +精度の小数点以下桁。 Doubleには、いくつかの計算、特にいくつかの統計計算に便利な、より多くの範囲の利点があります(より大きな数値と小さな数値を表すことができます)。

Decimalは小数点以下4桁の固定小数点です。これはそうではありません。あなたはこれを疑う場合は、次のコード行が0.0000000001をもたらすことの通知:

Console.WriteLine("number={0}", 1m/10000000000m); 

ことのすべてを言って、それを金額で作業するための、世界で最も広く使用されているソフトウェアは、Microsoft Excelを注意することは興味深いことです倍精度を使用します。もちろん、彼らはそれがうまく動作するように多くのフープを飛び越えなければなりません、そして、それは依然として必要なものを残します。 -2.77e-17〜最初の利回り0、第二利回り

  • = 1-0.9-0.1
  • =(1-0.9-0.1)

:Excelでこれらの2つの式を試してみてください。場合によっては数値を加算したり減算したりするときにExcelが実際に数値をマッサージしますが、すべての場合にマッサージするわけではありません。

+0

きちんとしたExcelの例! –

+0

お金の小数は良いです。しかし、金銭の比率は依然として倍(例えば金利)であるべきである。 – Richard

6

Martin Fowlerは、Money classを使用することをお勧めします。根拠については、リンクを参照してください。そこに彼のアイデアの多くの実装がある、またはあなた自身を書くことができます。 Fowler自身の実装はJavaで行われるため、クラスを使用します。私が見たC#のバージョンでは構造体を使用していますが、これは分かりやすいようです。

0

除算が必要な場合は、他の人に推薦されるように、私の推奨はDecimalを使用することです。単純な集計アプリケーションでは、Integer型をお勧めします。どちらのタイプでも、私はいつも最も低い通貨単位で働きます。 (すなわち、カナダ/セントのセント)

私は@dangphによって追加されたファウラーのマネーコールの理論が好きです。

0

どのような処理を行っていても、アプリケーションの各階層で通貨金額がどのように処理されるかを理解していることを確認してください。

SQLServerと.Netが通貨を丸めるさまざまな方法を使用しており、アプリケーションが特定のタイプの計算をどのように処理したかが一貫していないため、ネットで。興味がある場合は、「bankers' rounding」を参照してください。

通貨の書式設定に関連する問題もあります。英国以外の金額、他の言語や文化などに対処する必要があるかどうかは不明ですが、複雑さが増します。

+0

注意すべき別の問題は、SQL Serverが3.33ミリ秒(0.0033秒)の精度でDATETIMEを格納することです。私はかつて私の目的のために十分ではなかったので、これでちょっとやりました。 – ahsteele

0

適切なデータタイプを使用する以外に質問で示したように、プログラムが通貨換算をどの程度うまく処理できるかが重要です。もちろん、この問題は通貨に限定されません。 Jeff Atwoodは、The Turkey Testの成果を要約した素晴らしい投稿をしました。

関連する問題