当我运行时:
for($o=1;$o<=655;$o++){ $r = $r+0.01; echo $r." ";}
在某种程度上,我得到了:
...4.29 4.3 4.31 4.32 4.33 4.34 4.35 4.36 4.37 4.38 4.39 4.4
4.41 4.42 4.4299999999999 4.4399999999999 4.4499999999999
4.4599999999999 4.4699999999999 ...但是当我运行的时候:
for($o=1;$o<=5;$o+=0.01){ echo $o." "; }
异常开始于:
4.34 4.35 4.36 4.37 4.38 4.3899999999999 4.3999999999999为什么加法是for循环的一部分,还是在for循环中存在差异?
发布于 2012-11-08 07:17:11
欢迎来到四舍五入误差的奇观。
0.01不能精确地表示为有限的二进制分数,所以如果您将其重复添加到另一个浮点数上,最终会产生舍入误差。
您看到舍入误差的特定点取决于所涉及的数字的二进制展开如何产生舍入误差。
发布于 2012-11-08 07:17:24
浮点数学不能精确地表示这些值。参见here。
发布于 2012-11-08 09:26:47
当将数字“.01”转换为64位IEEE754二进制浮点时,结果为0.010000000000000000208166817117216851329430937767028809.当$r设置为0,并且将此.01的近似值添加100次时,由于加法过程中的其他舍入误差,结果为1.0000000000000006661338147750939242541790008544921875,。
现在,考虑到$r从这个值进一步递增到略高于1的值,而$o从它的起始值恰好为1递增。首先,由于$r和$o的起始值不同,因此它们在以后通常会有不同的值。其次,因为它们是不同的,当增量被添加到它们中的每一个时,它们在加法中四舍五入时遇到不同的误差。这种错误可能恰好加强或取消,导致$r或$o或多或少不同。
最后,PHP有一些标准来决定是否打印带有两个小数点或更多小数点的数字。假设在某个时刻,PHP或$o的值与带有两个小数点的最近数字之间的距离足够远,以至于$r决定应该打印更多的数字。如上所述,对于$r和$o,这发生在不同的时间。
https://stackoverflow.com/questions/13279919
复制相似问题