2010-07-13 85 views
0

我得到不同的结果,当试图分裂在PHP和C#一样的数字:浮点运算返回不同的结果在PHP和C#

PHP:

echo 1000/0.03475; 
output:28776.9784173 

C#:

1000/0.03475 
output:28776,9784172662 

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

+4

我会说他们个人是相同的结果。 – 2010-07-13 11:12:33

+0

不同的语言/库使用不同的算法/代码。所以浮点值在某种精度上有所不同,这并不奇怪。这个问题更可能是如何显示结果。 – 2010-07-13 11:12:33

+1

@Mitch小麦:不是标准(这里是:IEEE标准754)的要点,所有的实现产生相同的结果? – dtb 2010-07-13 11:13:40

回答

4

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

0

因为这就是它们如何显示。

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

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

然而,在PHP浮子作为同一semantincs一个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,denormals)是可选的。

在C#a float32-bit wide并保证(主要)符合IEEE 754。最接近PHP的浮点数是C#double

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/