【问题标题】:For loop is not running for float valuesFor 循环未针对浮点值运行
【发布时间】: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 个答案无效。

标签: php for-loop floating-point


【解决方案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>";
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-10
          • 1970-01-01
          • 1970-01-01
          • 2015-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-23
          相关资源
          最近更新 更多