PHP舍入错误
我在我的linux服务器上使用PHP 5.2.13。在舍入数字时,我遇到了奇怪的错误。这是我的测试用例:
<?php
echo " " . round(1.505, 2) . "n";
echo " " . round(11.505, 2) . "n";
echo " " . round(111.505, 2) . "n";
echo " " . round(1111.505, 2) . "n";
echo " " . round(11111.505, 2) . "n";
echo " " . round(111111.505, 2) . "n";
echo " " . round(1111111.505, 2) . "n";
echo " " . round(11111111.505, 2) . "n";
echo "" . round(111111111.505, 2) . "n";
这是结果:
1.51
11.51
111.51
1111.51
11111.51
111111.51
1111111.5
11111111.51
111111111.51
谁知道是什么原因造成的?我无法更新PHP,因为它是共享服务器。
没有找到相关结果
已邀请:
5 个回复
览幕堤分
膝垫富顷
你会期望它打印0.01,对吗? 但它会打印一个非常奇怪的答案,如0.009999999999998 与其他数字一样,浮点数double或float作为0和1的字符串存储在内存中。浮点与整数的不同之处在于我们在想要查看它们时如何解释0和1。它们的存储方式有很多标准。 浮点数通常从左到右打包到计算机数据中作为符号位,指数字段和有效数字或尾数.... 由于缺乏足够的空间,十进制数字没有很好地用二进制表示。所以,你不能完全表达1/3,因为它是0.3333333 ...,对吗?为什么我们不能将0.01表示为二进制浮点数是出于同样的原因。 1/100为0.00000010100011110101110000 .....重复10100011110101110000。 如果0.01以二进制形式保存为01000111101011100001010的简化和系统截断形式,当它被转换回十进制时,它将被读取为0.0099999 ......取决于系统(64位计算机将提供比32位更好的精度)。在这种情况下,操作系统决定是否按照它看到的方式打印它,或者如何以更人性化的方式进行打印。因此,它依赖于机器的方式来表示它。但它可以用不同的方法在语言层面进行保护。 如果格式化结果,则echo number_format(0.009999999999998,2);它将打印0.01。 这是因为在这种情况下,您将指示如何阅读以及您需要的精度。 参考文献:1,2,3,4,5
悸翠疮武昏
究补闯
括宠