C# 双重加法 - 奇怪的行为

标签 c# math c#-4.0 double addition

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 方法会产生准确的结果,而迭代求和则不会。 (当我打印这两个值时,它们是相同的,但我认为这是由于 WriteLine 方法进行了一些舍入。)

有人知道这是怎么回事吗?

最佳答案

float 学本质上不是 100% 准确的,并且存在错误。将不同数字相加的顺序会影响浮点误差的大小。如果这些计算的完全准确很重要,您应该使用小数,而不是 double 。

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

关于C# 双重加法 - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10056117/

相关文章:

c# - MVVM 中的事件处理

c# - SharpSVN 不迭代所有子目录和文件

C# CSV 动态拆分

javascript - 向服务/产品添加百分比的正确方法是什么?

c++ - xcode 上的 atan2f 精度

c# - 为什么当 Alpha==0 时 System.Drawing.Graphics 会消隐 RGB channel ?

c# - 使用 C# Windows 应用程序填充 checkedListBox

math - 计算贝塞尔样条曲线以从一个点到另一个点

.net - System.Security.Cryptography.CryptographicException - 对象已存在

asp.net 3.5升级到4.0 IIS6 ReturnURL问题