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

C# 为什么添加float会根据其执行方式给出不同的结果,c#,floating-accuracy,C#,Floating Accuracy,我在C#中添加浮动时遇到了一个问题。以下内容取自VisualStudio中的即时窗口。我已经声明f为float,现在用两种不同的方式进行简单计算: f = 5.75f + 0.075f*37 8.525001 f = 0.075f*37 2.775 f = f + 5.75f 8.525 正如您所看到的,进行相同计算的两种方法的结果不同。这怎么可能。在我看来,这些数字远没有接近浮点的精度极限,所以发生了什么 在我看来,这些数字远没有达到浮点的精度极限 它们确实是——或者更确切地说,区别在于 涉

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

f = 5.75f + 0.075f*37
8.525001
f = 0.075f*37
2.775
f = f + 5.75f
8.525
正如您所看到的,进行相同计算的两种方法的结果不同。这怎么可能。在我看来,这些数字远没有接近浮点的精度极限,所以发生了什么

在我看来,这些数字远没有达到浮点的精度极限

它们确实是——或者更确切地说,区别在于

涉及的准确值为8.52500057220458984375(显示时四舍五入至8.525001)和8.5249996185302734375(显示时四舍五入至8.525)。这两个值之间的差值为0.0000009536743164062。考虑到
float
只有7位小数精度(根据),在我看来,这是一个相当合理的误差

实际上,这里重要的不是操作的顺序。如果将其切换,则会得到完全相同的结果:

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));
(使用我的类。)

不同之处在于,在第一个版本中,所有信息都可以一次性获得——实际上是在编译时获得的。编译器执行该算法,我怀疑它实际上以更高的精度执行,然后将整个结果的精度降低到32位

在我看来,这些数字远没有达到浮点的精度极限

它们确实是——或者更确切地说,区别在于

涉及的准确值为8.52500057220458984375(显示时四舍五入至8.525001)和8.5249996185302734375(显示时四舍五入至8.525)。这两个值之间的差值为0.0000009536743164062。考虑到
float
只有7位小数精度(根据),在我看来,这是一个相当合理的误差

实际上,这里重要的不是操作的顺序。如果将其切换,则会得到完全相同的结果:

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));
(使用我的类。)


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

我所说的值不接近精度的意思是示例中的最大值是4位,但我猜这是精度与精度的关系。我并不是在质疑操作的顺序,而是在分两步而不是一步进行操作时,值发生了变化。谢谢你的见解。@Keller:如果你只看4位有效数字,那么它们是相等的:)我所说的值不接近精度的意思是,示例中的最大值是4位,但我想这是关于精度与精度的关系。我并不是在质疑操作的顺序,而是在分两步而不是一步进行操作时,值发生了变化。谢谢你的洞察力。@Keller:如果你只看4个有效数字,那么它们是相等的:)