如果我只使用第一个参数调用它,我有以下功能可以正常工作:
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,即使数字是相同的。任何人都可以建议为什么会这样?干杯
答案 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并不总是初始化。总是初始化返回值是一个好习惯。