为什么添加float会根据其执行方式给出不同的结果

时间:2014-04-01 05:43:16

标签: c# floating-accuracy

在C#中添加浮动时,我遇到了一个问题。以下内容取自Visual Studio中的即时窗口。我已将f声明为float,现在以两种不同的方式进行简单的计算:

f = 5.75f + 0.075f*37
8.525001
f = 0.075f*37
2.775
f = f + 5.75f
8.525

正如您所看到的,两种执行相同计算的方法之间的结果不同。怎么可能。正如我所看到的那样,数字远不及浮动的精度极限,所以发生了什么?

1 个答案:

答案 0 :(得分:4)

  

正如我所看到的,数字远不及浮动的精度限制

他们确实 - 或者更确切地说,区别在于。

所涉及的精确值为8.52500057220458984375(显示为四舍五入至8.525001)和8.5249996185302734375(显示为四舍五入至8.525)。这两个值之间的差异是0.0000009536743164062。鉴于float只有7个十进制数字的精度(根据documentation),在我看来,这是一个非常合理的不准确性。

实际上并不是这里重要的操作顺序。如果将它们切换为完全相同的结果:

float f = 0.075f * 37 + 5.75f;
Console.WriteLine(DoubleConverter.ToExactString(f));
f = 5.75f;
Console.WriteLine(DoubleConverter.ToExactString(f));
f = f + 0.075f * 37;
Console.WriteLine(DoubleConverter.ToExactString(f));

(使用我的DoubleConverter课程。)

不同之处在于,在第一个版本中, all 信息可以一次性使用 - 实际上是在编译时。编译器执行算术运算,我怀疑它实际上是以更高的精度执行它,然后将整个结果的精度降低到32位。