【问题标题】:Adding floats does not yield a correct result添加浮点数不会产生正确的结果
【发布时间】:2013-06-28 21:23:40
【问题描述】:

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

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

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

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

那么total代表正确的值。

这可能是由于浮点数和双精度数的差异造成的吗?

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

【问题讨论】:

  • float 类型的变量只有 7 位精度,而 double 类型的变量有 15 位精度。
  • 向我们展示花车,然后我们就可以提供帮助...?
  • @newStackExchangeInstance:值是随机的(不像“随机生成”,但它们可以是任何值)

标签: c# .net double floating-accuracy


【解决方案1】:

这可能是由于浮点数和双精度数的差异造成的吗?

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

【讨论】:

  • decimal more 是正确的,因为它使用了更多的位(比double 来表示一个值?
  • .NET 的 System.Decimal 令人惊讶的一点是,它有时使用 29 个十进制数字,有时使用 28 个。因此,像 800m/3m * 3m500m/3m * 3m 这样的人 expect 是等价的,不相似(猜猜哪一个是整数(带有尾随零))。
  • @BartVG 正因为如此,它更精确
  • @BartVG double 可以表示大得多和小得多的值;它有更多的范围,但更少的精度msdn.microsoft.com/en-us/library/364x0z75(v=vs.110).aspxmsdn.microsoft.com/en-us/library/678hzkk9(v=vs.110).aspx
【解决方案2】:

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

【讨论】:

  • 我应该提到它们在 SQL Server 中存储为real。但即便如此(SQL 中real 值的总和)也比C# 中float 值的总和更准确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2014-07-20
  • 2016-05-02
  • 1970-01-01
相关资源
最近更新 更多