4

我有一个用 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 value = 0.333333

任何人都可以对其进行整理并解释在 Visual Studio 和 Visual C++ 6.0 中为 c 具有相同值的方法吗?


实际上这些值是从监视窗口中获取的。我开始知道不同版本的视觉工作室可能在浮点格式表示上有所不同。因此 watch 中的值可能没有用。这就是为什么我在两个 Visual Studio 版本中都打印了这些值的原因,结果如下。使用 Visual Studio 6.0 使用 Visual C++ 语言,它是 0.333333(六个 3)

但使用 C# 语言的 Visual Studio 10 为 0.3333333(七个 3)

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

4

4 回答 4

15

鉴于精确值是 0.3 重复出现,它们都不是“正确的” - 如果您试图匹配二进制浮点计算的精确结果,由于它们的工作方式,这通常是一个坏主意。(有关更多信息,请参阅我关于.NET 中的二进制浮点的文章。)

可能一开始就不应该使用二进制浮点数(例如,如果您的值代表精确的、人为的金额,例如金钱)。或者,您可能应该只对特定容差进行相等比较。

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

于 2011-12-15T12:34:23.690 回答
5

C#只是显示更少的小数位。0.333333343四舍五入到六位有效数字是0.333333。的基础价值c是相同的。

当然,如果你想要更高的精度,你总是可以使用double变量。

于 2011-12-15T12:41:08.503 回答
3

C# 浮点可以由floatdouble类型处理。类型的float精度为 7 位和double16。

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

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

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

于 2011-12-15T12:43:43.910 回答
1

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

于 2011-12-15T12:54:53.090 回答