2
public static void Main()
{
    Dictionary<string, double> values = new Dictionary<string, double>();
    values.Add("a", 0.002);
    values.Add("b", 0.003);
    values.Add("c", 0.012);

    // Summing iteratively.
    double v1 = 615.0;
    foreach (KeyValuePair<string, double> kp in values)
    {
        v1 += kp.Value;
    }

    Console.WriteLine(v1);

    // Summing using the Sum method.
    double v2 = 615.0;
    v2 += values.Values.Sum();

    Console.WriteLine(v2);

    Console.ReadLine();
}

デバッガーで v1 の値を見ると、値は 615.01699999999994 ですが、v2 の値は 615.017 です。何らかの理由で、Sum メソッドは正確な結果を生成しますが、それらを繰り返し合計すると正確な結果が得られません。(2 つの値を出力すると同じ値になりますが、これは WriteLine メソッドによる丸めが原因であると推測されます。)

ここで何が起こっているか知っている人はいますか?

4

2 に答える 2

6

浮動小数点演算は本質的に 100% 正確ではなく、誤差があります。異なる数値を加算する順序は、浮動小数点エラーの量に影響を与える可能性があります。これらの計算が完全に正確であることが重要な場合は、2 倍ではなく 10 進数を使用する必要があります。

これは、Sum の使用と手動でのデータの合計には何の関係もありません。最初に各数値を 615 に加算し、2 番目にすべての数値を加算してから 615 に加算します。同じデータを加算する順序が異なります。どちらの方法を使用するかによって、多かれ少なかれエラーが発生する可能性があります。

于 2012-04-07T16:38:32.390 に答える
0

double / floatの問題は、それらが2進数であり、内部的には1000110.10101001であるため、値のおおよその表現にすぎないことです。

Jon Skeetの説明を読んでください:.NETのdecimal、float、doubleの違いは?

于 2012-04-07T16:51:30.143 に答える