For 循环未针对浮点值运行

Posted

技术标签:

【中文标题】For 循环未针对浮点值运行【英文标题】:For loop is not running for float values 【发布时间】:2011-12-23 14:18:05 【问题描述】:

我有一个像下面这样的 for 循环

<?php 

 for($i=0;$i<=10;$i+0.4)

 echo $i."<br>";
 

 ?>

此代码将 i 的值打印到 9.6 而不是 10。

为什么最后返回 i=10 的值。

【问题讨论】:

你弄错了,$i+0.4 可能是$i+=0.4,因为你说它一直到 9.6,导致下面的 3 个答案无效。 【参考方案1】:

因为代表机器的浮点数 - http://en.wikipedia.org/wiki/Floating_point

我建议对循环使用整数索引

【讨论】:

+1。但并不总是可以使用整数索引。在这些情况下,您必须使用 epsilon 值 - 例如允许的错误。看我的回答。【参考方案2】:

使用+= 来增加它,而不仅仅是加号。就像现在一样,它对我来说是一个无限循环。

编辑:由于某种原因,PHP 无法在循环中的不同类型下正常工作。

下面的应该可以工作

for($i=0;$i<=100;$i+=4)
   echo $i/10."<br>";
 

这是var_dump

int(0)

float(0.4)

float(0.8)

float(1.2)

float(1.6)

int(2)

float(2.4)

float(2.8)

float(3.2)

float(3.6)

int(4)

float(4.4)

float(4.8)

float(5.2)

float(5.6)

int(6)

float(6.4)

float(6.8)

float(7.2)

float(7.6)

int(8)

float(8.4)

float(8.8)

float(9.2)

float(9.6)

int(10)

这可能是 PHP 正在执行的自动转换导致的

【讨论】:

为什么不打印 10. 我只是问这个。请【参考方案3】:

准确的 FLOAT 比较存在问题(发生在 = 中)。

这样做:

 for($i=0; $i<=100; $i+=4)
     echo ($i/10)."<br>";
 

【讨论】:

【参考方案4】:

为了精确比较,您可以对这些值进行四舍五入,如下所示...

<?php

   for($i=0; round($i,1) <= 10; $i += 0.4)
      echo $i."<br/>";
   

?>

【讨论】:

【参考方案5】:

你可以这样做:

<?php 

 for($i=0;$i<=100;$i += 4)

 echo ($i/10)."<br>";
 

 ?>

结果在这里:http://codepad.org/CxvzEUeq

【讨论】:

但实际上我有两个值,一个是 $start,第二个是 $end。这些值可以是 float 或 int 之类的任何值。所以我的 for 循环就像 for($i=$start;$ 当您按照另一个答案中的建议进行比较时,这会出现问题 @user1031816:我已经发布了另一个答案,它显示了事情应该如何完成。使用 epsilon 值。【参考方案6】:

&lt;?php

for($i=0;$i&lt;10;$i+0.4)

echo $i."&lt;br&gt;";

?&gt;

如果你输入 i

【讨论】:

【参考方案7】:

比较时必须使用epsilon值,表示比较float值时允许的错误。

$epsilon=0.000001; //a very small number

for($i=0; $i<10 or abs($i-10)<$epsilon; $i+=0.4)
   echo $i."<br>";

【讨论】:

以上是关于For 循环未针对浮点值运行的主要内容,如果未能解决你的问题,请参考以下文章

为啥for循环最少避免使用浮点型变量作为循环变量

基于带有循环的“编码”整数应用浮点值

for循环的起始值终止值步长只能是整数

从浮点字符串到 Int 的 Python 类型转换在创建列表时无法在 for 循环中工作

Objective C中的浮点值除法错误

Python 使用省略号或无 + 浮点类型提示未分配属性