1

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

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

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

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

然后total代表正确的值。

这可能是由浮点数和双精度数之间的精度差异引起的吗?

请注意,这取决于值。这个计算的大部分结果都是正确的。

4

2 回答 2

3

这可能是由浮点数和双精度数之间的精度差异引起的吗?

是的。有时也可能仅仅是因为并非所有值都可以用IEEE 浮点数表示;在您期望“精确”总和(金钱等)的许多情况下,通常最好使用decimal. 然而,这不应该被解释decimal为“精确”——只是它的舍入方式更有利于我们人类对舍入的看法。

于 2013-06-28T21:29:16.680 回答
2

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

于 2013-06-28T21:29:24.853 回答