C#中的舍入错误:不同PC上的结果不同

时间:2009-10-24 03:46:56

标签: c# rounding

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

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

现在我知道我想使用Convert.Int32(金额)而不是输入一个int,这解决了问题。但我的问题确实是这个......

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

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

感谢。

大卫

2 个答案:

答案 0 :(得分:8)

事实上,你可以得到不同的结果:

  • 在不同的机器上

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

  • 取决于您是否使用编译时常量或运行时值进行数学计算

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

  • 依此类推。

C#规范调用浮点运算可以更高精度完成比你预期的更高。它永远不会以较低的精度完成,但我们保留在某些硬件上使用更高精度的算法并且可以使用某些优化的权利,只要抖动认为它可以逃脱它。这意味着在对精度的微小变化高度敏感的操作中 - 例如舍入 - 可能会给出非常不同的结果,似乎没有解释。

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

答案 1 :(得分:2)

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

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