
php的log()函数返回浮点数,受二进制浮点表示限制,实际值常为无限接近但不等于理论值(如1.4999999999999998而非精确1.5),因此直接用==判断会失败。
在PHP中,log(1000, 100) 的数学意义是求以100为底1000的对数,即满足 $100^x = 1000$ 的 $x$。由于 $100^{1.5} = (10^2)^{1.5} = 10^3 = 1000$,理论上结果确为 1.5。但计算机底层使用IEEE 754双精度浮点数表示小数,而十进制小数1.5虽可精确表示,但对数运算过程涉及多步近似(如自然对数转换:$\log_b a = \frac{\ln a}{\ln b}$),中间计算会引入微小舍入误差。
运行以下代码即可验证真实值:
$value = log(1000, 100); var_dump($value); // float(1.4999999999999998) echo $value . "\n"; // 输出看似"1.5",实为字符串隐式截断
此时 $value == 1.5 返回 false,因为浮点数比较必须考虑精度容差,而非依赖表观相等。
✅ 正确做法是显式处理精度:
立即学习“PHP免费学习笔记(深入)”;
- 使用 round($value, $precision) 四舍五入到所需小数位;
- 或采用「容差比较」(推荐用于科学/金融计算):
$value = log(1000, 100);
$tolerance = 1e-10;
if (abs($value - 1.5) < $tolerance) {
echo 'Equal';
} else {
echo 'Not Equal';
}⚠️ 注意事项:
- 避免对浮点数使用 == 或 === 直接比较;
- round() 适用于已知预期精度的场景(如本例只需1位小数),但需注意 round(1.45, 1) 在PHP旧版本中可能因“银行家舍入”行为产生意外结果(建议使用PHP ≥ 7.4并确认round()模式);
- 涉及金额或高精度需求时,优先考虑BCMath或GMP扩展。
总结:这不是PHP的bug,而是所有遵循IEEE 754标准的语言共有的浮点数本质限制。编写数值比较逻辑时,始终将精度意识作为基本编程习惯。











