添加浮动不会产生正确的结果(Adding floats does not yield a corre

2019-10-30 09:38发布

想象一下下面的情况。 量加入以在一个循环中一共有:

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

total ,如逢因为所有的amount s的写入数据库。 当我计算SUM(amount)在SQL中,其导致从不同的值total 。 此外,当我在C#相同的计算,但这次加入量以double类型的值,

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

然后total表示正确的值。

难道这是一个浮动和双之间的精度差异引起的?

请注意,这取决于值。 大多数这种计算的结果正确的。

Answer 1:

是。 SQL Server的浮动大小是变量,但你可能在数据库8间字节浮动。 当您在C#代码中使用双打(8个字节)的结果都是一样的,当你使用浮点数(4个字节),它们是不同的。 浮子的范围内的双精度值将不相同的浮点值。



Answer 2:

难道这是一个浮动和双之间的精度差异引起的?

是。 它也可以有时简单地是因为不是所有的值可以在IEEE浮点表示 ; 在你期望“精确”的资金(货币等)很多情况下,它通常是更好地使用decimal 。 然而,这不应该被解释为decimal就是“精确” -简单地认为其四舍五入的方式更有利于我们人类怎么想的舍入。



文章来源: Adding floats does not yield a correct result