C#双加成 - 奇怪的行为(C# double addition - strange behavio

2019-06-23 11:31发布

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();
}

当我看着它给人的615.01699999999994值调试器V1的价值,但对于V2它给人的615.017值。 出于某种原因,数总和法得出准确的结果,而对它们求和迭代没有。 (当我打印两个值它们是相同的,但我相信这是由于一些舍入WriteLine方法一样。)

任何人都知道这是怎么回事?

Answer 1:

浮点运算本身是不是100%准确,有误差。 在其中添加不同的号码一起顺序可能会影响多少浮点错误存在。 如果这些计算是完全准确的,你应该使用十进制是很重要的,而不是增加一倍。

这不会有什么用点心与数据总结手动。 在你第一次添加的每个号码615,你去,在第二你所有号码添加到彼此,然后将它们添加到615这是添加相同数据的不同排序。 根据该号码,你使用这两种方法可能会导致更多或更少的错误。



Answer 2:

双/浮动的问题是,他们是二进制数,又名1000110.10101001内部,因此只能代表你的价值观的近似表示。

阅读乔恩斯基特的解释: 小数,浮点数和.NET双区别?



文章来源: C# double addition - strange behaviour