如果仍然有人到达这个页面,类似的问题在浮动数字减法导致错误或奇怪的值。 我想用更多的细节来解释这个问题。罪魁祸首是浮点数。 而不同的操作系统和不同版本的编程语言可以有不同的表现。
为了说明这个问题,我将用下面的一个简单例子来解释为什么。
它不是PHP直接相关,它不是一个错误。但是,每个程序员都应该知道这个问题。
这个问题甚至在二十年前花了很多生命。
1991年2月25日,MIM-104“爱国者”导弹电池中的浮点数计算问题阻止了它拦截在沙特阿拉伯首都达兰发射的飞毛腿导弹,导致28名美国陆军第14军需官支队士兵死亡。
但为什么会发生?
原因是浮点值表示有限的精度。所以,在任何处理之后,值可能 不具有相同的字符串表示。它也包括 包括在脚本中写入一个浮点值,并直接打印它,而不进行任何数学运算。
只是一个简单的例子:
$a = '36';
$b = '-35.99';
echo ($a + $b);
你希望它打印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。
这是因为在这种情况下,你指示应该如何阅读它,以及你需要的精度。
调查php.ini中的'precision'以获得更多扫描,PHP范围内的更改。但是,请注意,您正在处理*有效数字*。 – 2009-10-22 02:40:12