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

时间:2010-07-13 11:09:01

标签: c# php

尝试在PHP和C#中划分相同的数字时得到不同的结果:

PHP:

echo 1000/0.03475; 
output:28776.9784173

C#:

1000/0.03475
output:28776,9784172662

为什么呢?以及如何获得相同的结果?

4 个答案:

答案 0 :(得分:4)

但它们确实给出了相同的结果,只是在显示时四舍五入到不同的小数位数。如果你要查看代表内存中浮点数的实际位,它们应该是相同的(给定相同的架构)。

答案 1 :(得分:1)

其他答案所说的可能是你有不同价值的原因(更准确地说,显示中的不同舍入)。

然而,在PHP中,一个浮点作为相同的语义C double(它通常有64位)具有(另外,PHP目标C89,而only C99 defined floating point arithmetic so that it complies with IEEE 754):

  

C89标准甚至不需要IEEE格式,对于C99,完全IEEE 754支持(Inf,NaN,非正规)是可选的。

在C#中,float32-bit wide,并且保证(大部分)符合IEEE 754标准。与PHP的浮点最接近的是C#double

答案 2 :(得分:0)

因为这就是他们的表现方式。

printf("%.10f\n", 1000 / 0.03475);

答案 3 :(得分:0)

有两种可能性,正如其他人所说:要么它们是相同的浮点值,要么只是打印不同,或者它们是不同的浮点值。要查看它们是否相同,您需要打印所有十进制数字 - 如果您的语言允许(C#和PHP不 - 请参阅我的文章http://www.exploringbinary.com/print-precision-of-dyadic-fractions-varies-by-language/)。

它们可能是不同的浮点值,因为并非所有编译器/解释器/运行时库都将每个十进制字符串转换为正确的浮点数(在您的示例中,我特别谈到0.03475部分)。有关详细信息,请参阅我的文章http://www.exploringbinary.com/incorrectly-rounded-conversions-in-visual-c-plus-plus/