PHP,函数在作为参数传入数字时中断

时间:2016-01-26 16:54:01

标签: php

如果我只使用第一个参数调用它,我有以下功能可以正常工作:

    function max_months($vehicle_age,$max_peroid,$no_older) {
            $tot_age_in = $vehicle_age + 315360000; 
            while ($tot_age_in > 536467742) {
                $tot_age_in = $tot_age_in - 31536000;
                if  ($tot_age_in < 536467742) {
                    $max_payback = floatval($tot_age_in - $vehicle_age);
                    $max_payback = seconds_to_month($max_payback);
                    break;
                }
            }
            return $max_payback;
        }

然而,当我改变这个功能并传递上面看到的数字时 参数,功能中断。

function max_months($vehicle_age,$max_peroid,$no_older) {
                $tot_age_in = $vehicle_age + $max_peroid;   
                while ($tot_age_in > $no_older) {
                    $tot_age_in = $tot_age_in - $max_peroid;
                    if  ($tot_age_in < $no_older) {
                        $max_payback = floatval($tot_age_in - $vehicle_age);
                        $max_payback = seconds_to_month($max_payback);
                        break;
                    }
                }
                return $max_payback;
            }

我这样调用这个函数:

$max_payback = max_months($vehicle_age,315360000,536467742);

$vehicle_age设置为288897248

所以在第一个实例中我返回一个有效数字,但是在第二个实例中我返回false,即使数字是相同的。任何人都可以建议为什么会这样?干杯

2 个答案:

答案 0 :(得分:1)

很可能你用完PHP_INT_MAX值,你可以通过

检查最大整数值
echo PHP_INT_MAX;

如果变量大于INT_MAX,则将其视为float值。这意味着,您必须处理浮点不精确问题。而不是检查&lt ;, ==或&gt;,您应检查要检查的值周围的某个范围 epsilon

通过更改下面的代码,可能会解决问题:

       function max_months($vehicle_age,$max_peroid,$no_older) {
            $e = 0.0001;
            $tot_age_in = $vehicle_age + $max_peroid;   
            while ($tot_age_in > $no_older-$e) {
                $tot_age_in = $tot_age_in - $max_peroid;
                if  ($tot_age_in < $no_older+$e) {
                    $max_payback = floatval($tot_age_in - $vehicle_age);
                    $max_payback = seconds_to_month($max_payback);
                    break;
                }
            }
            return $max_payback;
        }

另请参阅:http://php.net/manual/en/language.types.integer.php

当您使用硬编码数字时没有遇到这个问题,因为它们被视为常量,因此您没有浮动问题。

答案 1 :(得分:1)

$ max_payback并不总是初始化。总是初始化返回值是一个好习惯。