0

下面的代码应该检查输入的数字是否是 26 的幂。在 localhost 上,比较在应该为真时评估为假,但是当它在实时 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';
}

我应该注意,在本地主机上,“如果”有时会评估为真。每隔 26 次幂就会发生这种情况(例如,26 为真,676(26 平方)为假,17576(26 立方)为真)。但是,当它在实时服务器上运行时,一切都按预期工作,并且“if”对于 26 的每个幂都为真。

我无法弄清楚是什么导致了这种差异。实时服务器正在运行 PHP 5.3.8 我尝试了两个不同的本地堆栈(mamp 和 ampps),它们分别运行 PHP 5.3.6 和 5.3.10,并且两者都发生了同样的事情。

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

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

4

1 回答 1

2

由于浮点舍入问题,并且缺乏对准确性的承诺(log($foo, 26)可能在内部计算为log($foo)/log(26),这涉及浮点除法),这听起来根本不是您应该指望的事情,更不用说跨越不同的系统。我建议这样做:

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

只要$foo适合 PHP 整数类型,它就应该总是准确的。PHPpow承诺如果两个参数都是整数并且结果在整数范围内,则结果将是整数。通过找到 的以 26 为底的对数$foo,四舍五入,然后将 26 提高到那个幂,这段代码基本上找到了26 的最接近的幂$foo,然后可以直接比较那个幂$foo,看看它们是否相等。

于 2012-04-22T01:18:30.580 回答