C#双加 - 奇怪的行为

The*_*oss 1 c# math double addition c#-4.0

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();
}
Run Code Online (Sandbox Code Playgroud)

当我看着它给人的615.01699999999994值调试器V1的价值,但对于V2它给人的615.017值.由于某种原因,Sum方法产生精确的结果,而迭代地对它们求和则不会.(当我打印这两个值时它们是相同的,但我认为这是由于WriteLine方法所做的一些舍入.)

有谁知道这里发生了什么?

Ser*_*rvy 5

浮点数学本质上不是100%准确并且有错误.将不同数字添加到一起的顺序可能会影响浮点错误的数量.如果这些计算完全准确是很重要的,那么你应该使用十进制,而不是双精度.

这与使用Sum与手动求和数据无关.在第一个中,您将每个数字添加到615,在第二个中,您将所有数字相互添加,然后将它们添加到615.这是添加相同数据的不同顺序.根据您使用的数字,任何一种方法都可能导致更多或更少的错误.

  • @TheBoss:有没有办法知道他们必须总结哪个顺序才能得到*最少*错误?**是.**如果您正在进行大量计算并且需要能够估计误差范围或将其最小化,那么我建议您参加*数值方法*的本科课程,或获取此类课程的教科书并研究它.作为一个粗略的经验法则:**首先将小东西加在一起**.这并不能保证最小化误差,但这是一个很好的初步近似. (3认同)