【问题标题】:PHP for loop displaying strange resultsPHP for 循环显示奇怪的结果
【发布时间】:2013-06-27 02:56:10
【问题描述】:

我有这个代码:

for($i = 1; $i <= $max; $i+=0.1) {
    echo "$i<br>";
}

如果变量$max = 6; 的结果是:1, 1.1, 1.2, 1.3 .... 5.8, 5.9, 6,但是当变量$max = 4 的结果是:1, 1.1 ... 3.8, 3.9,但是缺少数字 4。

请解释这种行为,以及可能的解决方案。

当我使用条件$i &lt;= $max;$i &lt; $max;时结果是一样的

$max2, 3 or 4 时会出现该错误

【问题讨论】:

标签: php for-loop


【解决方案1】:

使用整数时应该设置精度,

像这样:

$e = 0.0001;
   while($i > 0) {
   echo($i);
   $i--;
}

【讨论】:

    【解决方案2】:
      You can use of number_format()
    
    <?php
    $max=6;
    for($i = 1; number_format($i,2) < number_format($max,2); $i+=0.1) {
    echo $i."<br>";     
    }
    

    ?>

    【讨论】:

    • 设置$max = 100 看看会发生什么。在我的例子中,舍入误差从 54.2 开始。
    【解决方案3】:
    $err = .000001//allowable error
    for($i = 1; $i <= $max+$err; $i+=0.1) {
        echo "$i<br>";
    }
    

    【讨论】:

    • 谢谢,这也解决了问题。请为答案投票。
    【解决方案4】:

    来自http://php.net/manual/en/language.types.float.php

    此外,可以精确表示为以 10 为底的浮点数的有理数,如 0.1 或 0.7,不具有以 2 为底的浮点数的精确表示,无论尾数大小如何,它都在内部使用.因此,它们不能在不损失一点精度的情况下转换成它们内部的二进制对应物。

    因此,要克服这个问题,您可以将数字乘以 10。 所以$max 是 40 或 60。

    for($i = 10; $i <= $max; $i+=1) {
        echo ($i/10).'<br>';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2016-10-04
      • 2019-08-05
      • 2017-05-19
      • 2016-05-26
      相关资源
      最近更新 更多