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

C#中的舍入误差:不同PC上的不同结果,c#,rounding,C#,Rounding,我在C#中有一个函数,它返回以下内容: ... float amount = smallestPercentage * (float)quantity; return (int)amount; 现在我知道我应该使用Convert.Int32(amount)而不是类型强制转换int,这就解决了这个问题。但我的问题真的是 在家中开发程序(Windows Vista)时,我会得到一个返回值1,但在将程序部署到另一个环境(Windows XP)时,我会得到一个返回值0 我想知道这是否与Windows版

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

...
float amount = smallestPercentage * (float)quantity;
return (int)amount;
现在我知道我应该使用Convert.Int32(amount)而不是类型强制转换int,这就解决了这个问题。但我的问题真的是

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

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

谢谢


David

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


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

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

  • 在不同的机器上

  • 取决于您是使用调试还是零售生成设置编译

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

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

  • 等等

C#规范指出,浮点运算的精度可能比您预期的要高。它从未以低于您预期的精度完成,但我们保留在某些硬件上使用更高精度算法的权利,并且在某些优化可用的情况下,任何时候抖动认为它可以逃脱惩罚。这意味着,在对精度的微小变化高度敏感的操作中,如舍入,可能会给出非常不同的结果,似乎没有任何解释


您不是第一个发现这一事实的堆栈溢出用户:

您要舍入的浮点值是多少?两台机器上都安装了什么版本的CLR?32位Vista,我不确定CLR:我应该检查吗?该值类似于0.00223949*450