我得到不同的结果,当试图分裂在PHP和C#一样的数字:浮点运算返回不同的结果在PHP和C#
PHP:
echo 1000/0.03475;
output:28776.9784173
C#:
1000/0.03475
output:28776,9784172662
为什么?以及如何获得相同的结果?
我得到不同的结果,当试图分裂在PHP和C#一样的数字:浮点运算返回不同的结果在PHP和C#
PHP:
echo 1000/0.03475;
output:28776.9784173
C#:
1000/0.03475
output:28776,9784172662
为什么?以及如何获得相同的结果?
但他们确实给出了相同的结果,只是在显示时四舍五入到不同的小数位数。如果您要查看表示内存中浮点数的实际位,则它们应该是相同的(给定相同的体系结构)。
因为这就是它们如何显示。
printf("%.10f\n", 1000/0.03475);
其他答案说的可能是你有不同的值(更准确地说,显示不同的舍入)的原因。
然而,在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 float
是32-bit wide并保证(主要)符合IEEE 754。最接近PHP的浮点数是C#double
。
有两种可能性,正如其他人所说的:要么它们是相同的浮点值,而只是打印不同,或者它们是不同的浮点值。要查看它们是否相同,则需要打印所有小数位 - 如果您的语言允许(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/。
我会说他们个人是相同的结果。 – 2010-07-13 11:12:33
不同的语言/库使用不同的算法/代码。所以浮点值在某种精度上有所不同,这并不奇怪。这个问题更可能是如何显示结果。 – 2010-07-13 11:12:33
@Mitch小麦:不是标准(这里是:IEEE标准754)的要点,所有的实现产生相同的结果? – dtb 2010-07-13 11:13:40