Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的舍入误差:不同PC上的结果不同_C#_Rounding - Fatal编程技术网

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

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

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

...
float amount = smallestPercentage * (float)quantity;
return (int)amount;
现在我知道我应该使用Convert.Int32amount而不是类型强制转换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