添加浮动不会产生正确的结果

时间:2013-06-28 21:23:41

标签: c# .net double floating-accuracy

想象一下以下情况。 金额在循环中添加到总数中:

float total = 0;
float[] amounts = new float[]{...};
foreach(float amount in amounts)
{
  total += amount;
}

total以及所有amount都写入数据库。 当我在SQL中计算SUM(amount)时,它会产生一个与total不同的值。 此外,当我在C#中进行相同的计算时,但这次将数量添加到double类型的值,

double total = 0;
//the rest of the code is the same as above

然后total代表正确的值。

这可能是由于float和double之间的精度差异引起的吗?

请注意,它取决于值。此计算的大部分结果 正确。

2 个答案:

答案 0 :(得分:2)

  

这可能是由于float和double之间的精度差异引起的吗?

是。它有时也可能只是因为并非所有值都可以在IEEE浮点中表示;在许多情况下,你期望“精确”的总和(金钱等),通常最好使用decimal。但是,这不应该被解释为decimal是“确切的” - 只是它的轮次更有利于我们人类如何看待四舍五入。

答案 1 :(得分:2)

是。 SQL Server的float大小是变体,但您可能在数据库中有8个字节的浮点数。当您在C#代码中使用双精度(8字节)时,结果是相同的,当您使用浮点数(4个字节)时,它们是不同的。 float范围内的double值与float值不同。

相关问题