[英]Floating point operation returns different result in PHP and C#
当尝试在PHP和C#中对相同的数字进行除法时,会得到不同的结果:
PHP:
echo 1000/0.03475;
output:28776.9784173
C#:
1000/0.03475
output:28776,9784172662
为什么? 以及如何获得相同的结果?
但是它们的确提供了相同的结果,只是在显示时四舍五入到小数点后的位数。 如果要查看代表内存中浮点数的实际位,则它们应该是相同的(给定相同的体系结构)。
其他答案可能是您拥有不同值(更准确地说,显示中的舍入不正确)的原因。
但是,在PHP中,浮点数与C double
精度词(通常具有64位)具有相同的语义(此外,PHP的目标对象是C89,而只有C99定义了浮点算法,使其符合IEEE 754 ):
C89标准甚至不需要IEEE格式,对于C99,完整的IEEE 754支持(Inf,NaN,反规范)是可选的。
在C#中, float
为32位宽,并且保证(主要)符合IEEE 754。 最接近PHP的float的是C# double
。
因为这就是它们的显示方式。
printf("%.10f\n", 1000 / 0.03475);
正如其他人所说,有两种可能性:要么它们是相同的浮点值,但打印方式不同,要么它们是不同的浮点值。 要查看它们是否相同,您需要打印所有十进制数字-如果您的语言允许(C#和PHP不允许),请参阅我的文章http://www.exploringbinary.com/print-precision-of -二进位分数-根据语言/ )。
它们可能是不同的浮点值,因为并非所有编译器/解释器/运行时库都将每个十进制字符串都转换为正确的浮点数(在您的示例中,我特别谈论的是0.03475部分)。 有关更多详细信息,请参见我的文章http://www.exploringbinary.com/incorrectly-rounded-conversions-in-visual-c-plus-plus/ 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.