在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
正如您所看到的,两种执行相同计算的方法之间的结果不同。怎么可能。正如我所看到的那样,数字远不及浮动的精度极限,所以发生了什么?
答案 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位。