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

本文关键字:结果 浮点数 添加 | 更新日期: 2023-09-27 18:20:24

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

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

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

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

total表示正确的值。

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

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

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

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

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

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