我有一个用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 ++相同的结果吗? (即如何进行浮动操作以在两个版本上产生相同的结果???)
答案 0 :(得分:15)
鉴于确切的值是0.3重复出现,它们都不是“正确的” - 如果你试图匹配二元浮点计算的精确结果,那通常是一个坏主意由于他们的工作方式。 (有关更多信息,请参阅我在binary floating point in .NET上的文章。)
可能你不应该首先使用二进制浮点数(例如,如果你的值代表精确的人工金额,比如金钱)。或者,您可能只应该使用特定容差进行相等比较。
也可能C#和C正在产生完全相同的位模式 - 但是由于这些值是格式化的,你会看到不同的结果。同样,我不会使用数字的文本表示进行比较。
答案 1 :(得分:5)
C#
只显示较少的小数位。 0.333333343
四位有效数字0.333333
为c
。 double
的基础值是相同的。
当然,如果您想要更高的精度,可以随时使用{{1}}变量。
答案 2 :(得分:3)
C#浮点数可以由float
和double
类型处理。 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)
。就是这样。