首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP异常/奇怪的行为

问PHP异常/奇怪的行为
EN

Stack Overflow用户
提问于 2012-11-08 07:15:08
回答 4查看 287关注 0票数 3

当我运行时:

for($o=1;$o<=655;$o++){ $r = $r+0.01; echo $r." ";}

在某种程度上,我得到了:

代码语言:javascript
复制
...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." "; }

异常开始于:

代码语言:javascript
复制
4.34 4.35 4.36 4.37 4.38 4.3899999999999 4.3999999999999

为什么加法是for循环的一部分,还是在for循环中存在差异?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-08 07:17:11

欢迎来到四舍五入误差的奇观。

0.01不能精确地表示为有限的二进制分数,所以如果您将其重复添加到另一个浮点数上,最终会产生舍入误差。

您看到舍入误差的特定点取决于所涉及的数字的二进制展开如何产生舍入误差。

票数 5
EN

Stack Overflow用户

发布于 2012-11-08 07:17:24

浮点数学不能精确地表示这些值。参见here。

票数 1
EN

Stack Overflow用户

发布于 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,这发生在不同的时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13279919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档