Visual Studio 2010的精度问题

时间:2011-12-15 12:30:56

标签: c# visual-studio-2010 vc6 floating-point-precision

我有一个用Microsoft Visual C ++ 6.0编写的应用程序。现在我使用C#在Visual Studio 2010中重写了应用程序,但由于精度问题,结果不匹配。其中一个精确问题是以下问题。

float a = 1.0f;

float b = 3.0f;

float c = a / b;

这是在Visual Studio 2010中运行的C#代码,c值= 0.333333343

但是相同的代码,在值定义中的值之后删除f,当在Visual C ++ 6.0上运行时,给出c值= 0.333333

任何人都可以对它进行排序并解释在Visual Studio和Visual C ++ 6.0中为c赋予相同值的方法吗?


实际上,这些值来自观察窗口。我开始知道不同版本的visual studio在浮点格式表示方面可能有所不同。因此,手表中的值可能没用。这就是我在两个visual studio版本中打印值的原因,结果如下。 使用visual c ++语言的visual studio 6.0,它是0.333333(六个3)

但是使用C#语言的visual studio 10它是0.3333333(七个3)

那么有人可以帮助我使我的C#程序产生与visual C ++相同的结果吗? (即如何进行浮动操作以在两个版本上产生相同的结果???)

4 个答案:

答案 0 :(得分:15)

鉴于确切的值是0.3重复出现,它们都不是“正确的” - 如果你试图匹配二元浮点计算的精确结果,那通常是一个坏主意由于他们的工作方式。 (有关更多信息,请参阅我在binary floating point in .NET上的文章。)

可能你不应该首先使用二进制浮点数(例如,如果你的值代表精确的人工金额,比如金钱)。或者,您可能只应该使用特定容差进行相等比较。

可能C#和C正在产生完全相同的位模式 - 但是由于这些值是格式化的,你会看到不同的结果。同样,我不会使用数字的文本表示进行比较。

答案 1 :(得分:5)

C#只显示较少的小数位。 0.333333343四位有效数字0.333333cdouble的基础值是相同的。

当然,如果您想要更高的精度,可以随时使用{{1}}变量。

答案 2 :(得分:3)

C#浮点数可以由floatdouble类型处理。 float类型的精度为7位,double为16。

我相信C ++标准精度大约是16位数(平均为15.9!)。

在任何情况下,任何表示都不是算术正确的,因为1/3是0.333重复出现。

我认为它只是你所看到的值的表示(请注意调试器会将值转换为字符串以供显示。如果你检查每个的内存位置,你可能会发现值是同样的。

答案 3 :(得分:1)

快速检查显示是的,数字完全相同。因此,您的问题的答案是,当您想要相同的输出时,您需要做的就是确保显示方法兼容。
例如,C中的printf("%9.7f", result)和C#中的string.Format("{0:0.0000000}", result)。就是这样。