intval(...)== floatval(...)在localhost上为FALSE,在实时PHP服务器上为TRUE

时间:2012-04-22 01:13:00

标签: php

以下代码应该检查输入的数字是否为26的幂。在localhost上,当它应该为true时,比较评估为false,但是当它在实时php服务器上运行时,它按预期工作

#there is an html text input
$foo = $_POST['someval'];

if(intval(log($foo, 26)) == floatval(log($foo, 26))) {
   echo 'yup, that there number is a power of 26';
}
else {
   echo 'nope, definitely not a power of 26';
}

我应该注意,在localhost上,“if”将有时评估为true。它发生在26的每个其他力量(例如26将是真的,676(26平方)将是假的,17576(26立方)将是真的)。但是当它在实时服务器上运行时,一切都按预期工作,并且“if”对每个26的幂都评估为真。

我无法弄清楚造成这种差异的原因。 实时服务器运行PHP 5.3.8 我尝试了两个不同的本地堆栈(mamp& ampps),它们运行PHP 5.3.6&分别为5.3.10和两者同样的事情。

我也尝试编写代码,以便数学在“if”语句之外完成,但也没有运气。

这不是一个高优先级的问题,因为代码在它应该(活)的地方工作,但是我知道存在差异。如果你知道发生了什么,或者你有更好的方法来检查数字是否是26的幂,请告诉我。

1 个答案:

答案 0 :(得分:2)

由于浮点舍入问题,并且缺乏准确性(log($foo, 26)可能在内部计算为log($foo)/log(26),这涉及浮点除法)这听起来不像那种你应该指望工作的东西,更不用说跨越不同的系统了。我会建议这样做:

$foo == pow(26, (int)round(log($foo, 26)))

只要$foo符合PHP整数类型就可以始终保持精确。 PHP的pow承诺如果两个参数都是整数且结果在整数范围内,则结果将是整数。通过查找$foo的base-26日志,对其进行四舍五入,并将该函数提高26,此代码基本上找到最接近的幂为26到$foo,然后权力可以直接与$foo进行比较,看看它们是否相等。