【问题标题】:Rounding Error in C#: Different results on different PCsC# 中的舍入错误:不同 PC 上的结果不同
【发布时间】:2009-10-24 14:58:38
【问题描述】:

我在 C# 中有一个函数,它返回以下内容:

...
float amount = smallestPercentage * (float)quantity;
return (int)amount;

现在我知道我应该使用 Convert.Int32(amount) 而不是类型转换为 int,这已经解决了问题。但我的问题真的是这个……

在家里开发我的程序 (Windows Vista) 我会得到返回值 1,但是当我将程序部署到另一个环境 (Windows XP) 时,我会得到一个返回值 0。

我想知道这是否与 Windows 版本、.NET 版本甚至 CPU 处理器有关?

谢谢。

大卫

【问题讨论】:

  • 你四舍五入的浮点值是多少?
  • 两台机器上都安装了哪个版本的CLR?
  • 32 位 Vista,我不确定 CLR:我应该检查一下吗?
  • 该值类似于 0.002223949 * 450

标签: c# rounding


【解决方案1】:

其实可以得到不同的结果:

  • 在不同的机器上

  • 取决于您是使用调试还是零售构建设置进行编译

  • 取决于您是在编译时常量还是运行时值中进行数学运算

  • 如何在您的方法中使用局部变量和其他临时值

  • 等等。

C# 规范指出,浮点运算的精度可能比您预期的更高。它永远不会以低于您预期的精度完成,但我们保留在某些硬件上使用更高精度算法并提供某些优化的权利,只要抖动认为它可以逃脱它。这意味着在对精度的微小变化高度敏感的操作中(例如舍入)可能会在没有解释的情况下给出截然不同的结果。

您不是第一个发现这一事实的 Stack Overflow 用户:Problem converting from int to float

【讨论】:

    【解决方案2】:

    在处理浮点数时,确实建议您使用某种舍入例程。在 C# 中,我认为最好的方法是 Math.Round 方法。

    至于为什么会发生这种情况,不同的处理器有不同的计算浮点数和双精度数的例程。在您的目标机器上,您可能会得到一个略低于 1 的值(例如,.999987),当转换为 0 时。自 CLR 创建以来,浮点数一直存在,因此这很可能是处理器特定的东西。操作系统很少干扰直接应用程序代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多