Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#双重加法-奇怪的行为 publicstaticvoidmain() { 字典值=新字典(); 添加(“a”,0.002); 添加(“b”,0.003); 添加(“c”,0.012); //迭代求和。 双v1=615.0; foreach(值中的KeyValuePair kp) { v1+=kp.值; } 控制台写入线(v1); //使用Sum方法求和。 双v2=615.0; v2+=values.values.Sum(); 控制台写入线(v2); Console.ReadLine(); }_C#_Math_C# 4.0_Double_Addition - Fatal编程技术网

C#双重加法-奇怪的行为 publicstaticvoidmain() { 字典值=新字典(); 添加(“a”,0.002); 添加(“b”,0.003); 添加(“c”,0.012); //迭代求和。 双v1=615.0; foreach(值中的KeyValuePair kp) { v1+=kp.值; } 控制台写入线(v1); //使用Sum方法求和。 双v2=615.0; v2+=values.values.Sum(); 控制台写入线(v2); Console.ReadLine(); }

C#双重加法-奇怪的行为 publicstaticvoidmain() { 字典值=新字典(); 添加(“a”,0.002); 添加(“b”,0.003); 添加(“c”,0.012); //迭代求和。 双v1=615.0; foreach(值中的KeyValuePair kp) { v1+=kp.值; } 控制台写入线(v1); //使用Sum方法求和。 双v2=615.0; v2+=values.values.Sum(); 控制台写入线(v2); Console.ReadLine(); },c#,math,c#-4.0,double,addition,C#,Math,C# 4.0,Double,Addition,当我在调试器中查看v1的值时,它给出的值为615.01699999994,但对于v2,它给出的值为615.017。出于某种原因,Sum方法会产生准确的结果,而迭代求和则不会。(当我打印这两个值时,它们是相同的,但我认为这是由于WriteLine方法所做的一些舍入。) 有人知道这里发生了什么吗?浮点数学天生就不是100%精确的,而且有错误。不同数字相加的顺序可能会影响浮点错误的大小。如果这些计算完全准确很重要,那么应该使用十进制,而不是双精度 这与使用求和与手动求和数据无关。在第一个过程中,你将每

当我在调试器中查看v1的值时,它给出的值为615.01699999994,但对于v2,它给出的值为615.017。出于某种原因,Sum方法会产生准确的结果,而迭代求和则不会。(当我打印这两个值时,它们是相同的,但我认为这是由于WriteLine方法所做的一些舍入。)


有人知道这里发生了什么吗?

浮点数学天生就不是100%精确的,而且有错误。不同数字相加的顺序可能会影响浮点错误的大小。如果这些计算完全准确很重要,那么应该使用十进制,而不是双精度


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

双精度/浮点数的问题在于它们是二进制数,内部称为1000110.10101001,因此仅表示您的值的近似表示


阅读Jon Skeet的解释:

这与使用双精度而不是十进制有关。浮点算术不是很好吗?看看这个话题,因为我想你会在那里找到一个好答案:。@TheBoss看到了同样的效果
double d1=615.0+(0.002+0.003+0.012);双d2=615.0+0.002+0.003+0.012public 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();
}