PHP for 循环有时过早停止

标签 php for-loop

我在使用 for 循环时遇到了一个奇怪的问题。我将一个数组传递给一个函数,该函数根据三个数组键(它实际上是在创建一个选择框)输出值:select_min、select_max 和 select_step。大多数时候,它是有效的。有时它不会增加最终时间。我也尝试过对无法正常工作的值进行硬编码。

代码是:

for( $a = $property['select_min']; $a <= $property['select_max']; $a += $property['select_step'] ) {
    echo $a . "<br/>";
}

我已经用 0.1 到 1.2 的“步长”对其进行了测试。我不明白为什么它在某些情况下不起作用。这似乎只是十进制值的问题。

最小值:0,最大值:20,步长:1 - 这有效,输出 0-20 以 1 为增量。

Min: 0.2, Max: 3, Step: 0.2 - 这不起作用,以 0.2 为增量输出 0.2 到 2.8,但不输出 3。不管我放什么 Max,它似乎总是失败。 ..除了当我从 0 运行到 22 时它起作用了。

最小值:0,最大值:7,步长:0.7 - 这不起作用。不输出 7。

有趣的案例:

最小值:0,最大值:3、6 或 9,步长:0.3 - 有效

最小值:0,最大值:12 或 15,步长:0.3 - 不起作用

我已经完成了许多其他测试,但无法找到为什么它在这些特定实例中不起作用的共同线索。

编辑: 感谢您的所有回复。我最终使用了 Petah 的解决方案并得出了这个结论:

for( $a = $property['select_min']; 
    bccomp( $a , $property['select_max'] , 1 ) <= 0; 
    $a = bcadd( $a , $property['select_step'] , 1 ) ) {
        $str_editor_html .= '<option value="' . ( !is_float( $property['select_step'] ) ? str_replace( ".0" , "" , $a ) : $a ) . '"' . ( strval( $value['setting'] ) == strval( $a ) ? ' SELECTED' : '' ) . '>' . ( !is_float( $property['select_step'] ) ? str_replace( ".0" , "" , $a ) : $a ) . '</option>';
}

我在“step”变量上添加了对 !is_float() 的检查。如果它是一个整数,我将去除小数点并尾随零以显示清洁度。可能有更直接的方法来做到这一点,但这非常有效。

再次感谢大家!

最佳答案

请参阅以下内容 http://php.net/manual/en/language.types.float.php

基本上,在 php 中比较 float 时没有任何保证。在上面的链接中,有一个红色框,其中描述了问题以及可以使用的替代方法。

关于PHP for 循环有时过早停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126678/

相关文章:

Stylus 的 PHP 预处理器脚本/库?

php - 在 ruby​​ 中使用 Blowfish 加密字符串返回的字符串比 php 中的相同进程更短

javascript - 在 `for` 循环和 `setTimeout()` 内传递数组和索引

R - 在循环中按属性缓冲 SpatialPolygons

java - 不熟悉的增强 for 循环语法

javascript - 针对所有另一个数组过滤数组

php - 设置默认值(条件赋值)

php - mt_rand() 在 Windows 中可以生成的最大数量是多少?

php - select query 锁表,为什么会这样

javascript - 为什么这个循环每次迭代重复两次?