想象一下以下情况。 金额在循环中添加到总数中:
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之间的精度差异引起的吗?
请注意,它取决于值。此计算的大部分结果 正确。
答案 0 :(得分:2)
这可能是由于float和double之间的精度差异引起的吗?
是。它有时也可能只是因为并非所有值都可以在IEEE浮点中表示;在许多情况下,你期望“精确”的总和(金钱等),通常最好使用decimal
。但是,这不应该被解释为decimal
是“确切的” - 只是它的轮次更有利于我们人类如何看待四舍五入。
答案 1 :(得分:2)
是。 SQL Server的float大小是变体,但您可能在数据库中有8个字节的浮点数。当您在C#代码中使用双精度(8字节)时,结果是相同的,当您使用浮点数(4个字节)时,它们是不同的。 float范围内的double值与float值不同。