71

私は常に c# で double 型の変数はお金に適していないと言います。すべての奇妙なことが起こる可能性があります。しかし、これらの問題のいくつかを示す例を作成することはできないようです。誰かがそのような例を提供できますか?

(編集; この投稿はもともと C# というタグが付けられていました; 一部の返信は の特定の詳細に言及してdecimalいるため、 を意味しますSystem.Decimal)。

(編集 2: 私は具体的にいくつかの C# コードを求めていたので、これは言語にとらわれないだけではないと思います)

4

8 に答える 8

118

非常に、非常に不適切です。10 進数を使用します。

double x = 3.65, y = 0.05, z = 3.7;
Console.WriteLine((x + y) == z); // false

(Jon のページの例- 推奨される読書 ;-p )

于 2008-11-25T08:50:55.520 に答える
34

丸めによって効果的に発生する奇妙なエラーが発生します。さらに、正確な値との比較は非常にトリッキーです。通常、実際の値が特定の値に「近い」かどうかを確認するには、ある種のイプシロンを適用する必要があります。

具体的な例を次に示します。

using System;

class Test
{
    static void Main()
    {
        double x = 0.1;
        double y = x + x + x;
        Console.WriteLine(y == 0.3); // Prints False
    }
}
于 2008-11-25T08:54:58.570 に答える
7

はい、不向きです。

私の記憶が正しければ、 double には約 17 個の有効数字があるため、通常、丸め誤差は小数点のはるか後ろで発生します。ほとんどの金融ソフトウェアは、小数点以下 4 桁を使用します。これにより、13 桁の小数点以下を使用できるため、1 回の操作で使用できる最大数は、米国の国債よりもはるかに多くなります。ただし、丸め誤差は時間の経過とともに加算されます。ソフトウェアを長時間実行すると、最終的にはお金を失い始めるでしょう。特定の操作はこれを悪化させます。たとえば、少量に大量を追加すると、精度が大幅に低下します。

お金の操作には固定小数点データ型が必要です。ほとんどの人は、あちこちで 1 セント損しても気にしませんが、会計士はほとんどの人のようではありません。

編集
このサイトによるとhttp://msdn.microsoft.com/en-us/library/678hzkk9.aspx Doubles は、実際には 17 ではなく 15 から 16 の有効数字を持っています。

@Jon Skeet decimal は、精度が高く、有効桁数が 28 または 29 であるため、double よりも適しています。つまり、累積された丸め誤差が重大になる可能性が低くなります。Boojum の言及のような固定小数点データ型 (つまり、セントまたは 100 分の 1 セントを表す整数) は、実際にはより適しています。

于 2008-11-25T09:08:45.873 に答える
5

decimal10の倍数のスケーリング係数を使用するため、0.1のような数値を正確に表すことができます。本質的に、10進型はこれを1/10 ^ 1doubleとして表しますが、aはこれを104857/2 ^ 20として表します(実際には、実際には大きな数/ 2 ^ 1023のようになります)。

Adecimalは、最大28/29の有効数字(0.1など)で基数10の値を正確に表すことができます。doubleできません。

于 2008-11-25T09:17:10.520 に答える
4

私の理解では、ほとんどの金融システムは整数を使用して通貨を表現します。つまり、すべてをセントで数えます。

IEEE倍精度は、実際には-2^53から+2^53の範囲のすべての整数を正確に表すことができます。(Hacker's Delight、pg。262)加算、減算、乗算のみを使用し、すべてをこの範囲内の整数に保つと、精度が低下することはありません。ただし、除算やより複雑な操作には非常に注意が必要です。

于 2008-11-25T09:19:45.477 に答える
4

何をしているのかわからない場合に double を使用するのは不適切です。

「double」は、1 セントの 90 分の 1 の誤差で 1 兆ドルの金額を表すことができます。そのため、非常に正確な結果が得られます。人を火星に送り、生き返らせるのにかかる費用を計算したいですか? ダブルで十分です。

しかし、お金に関しては、特定の計算は特定の結果を出さなければならないという非常に具体的なルールがしばしばあります。98.135 ドルに非常に近い金額を計算すると、多くの場合、結果が 98.14 ドルと 98.13 ドルのどちらになるかを決定するルールがあり、そのルールに従って必要な結果を取得する必要があります

住んでいる場所にもよりますが、64 ビット整数を使用して、セント、ペニー、コペイカなど、その国の最小単位を表すと、通常は問題なく機能します。たとえば、セントを表す 64 ビット符号付き整数は、最大 92,223 兆ドルの値を表すことができます。通常、32 ビット整数は不適切です。

于 2015-01-23T12:20:02.703 に答える
0

いいえ、double には常に丸め誤差があります。.Net を使用している場合は「10 進数」を使用してください...

于 2008-11-25T12:56:18.597 に答える
-5

実際、浮動小数点のdoubleは、適切な単位を選択する限り、金額を表すのに最適です。

http://www.idinews.com/moneyRep.htmlを参照してください。

固定小数点long も同様です。どちらも 8 バイトを消費しますが、 10 進項目 で消費される 16 バイトよりも確実に好ましいです。

何かが機能するかどうか (つまり、期待どおりの正しい結果が得られるかどうか) は、投票や個人の好みの問題ではありません。テクニックはうまくいくか、うまくいかないかのどちらかです。

于 2015-06-08T15:26:03.017 に答える