繁体   English   中英

浮点运算在PHP和C#中返回不同的结果

[英]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#中, float32位宽,并且保证(主要)符合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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM