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方法所做的一些舍入。)
任何人都知道这里发生了什么?
答案 0 :(得分:5)
浮点数学本质上不是100%准确且有错误。将不同数字添加到一起的顺序可能会影响浮点错误的数量。如果这些计算完全准确是很重要的,那么你应该使用十进制,而不是双倍。
这与使用Sum与手动求和数据无关。在第一个中,您将每个数字添加到615,在第二个中,您将所有数字相互添加到然后将它们添加到615.这是添加相同数据的不同顺序。根据您使用的数字,任何一种方法都可能导致更多或更少的错误。
答案 1 :(得分:0)
double / float的问题在于它们是二进制数,在内部又是1000110.10101001,因此只代表你的值的近似表示。
阅读Jon Skeet的解释:Difference between decimal, float and double in .NET?