PHP 8.1新增E_DEPRECATED警告,提示浮点数转整数时精度丢失,如~~(1.5)、(int)3.9、浮点作数组下标或位运算等,虽非致命错误但未来可能升级为报错。

这个警告是 PHP 8.1 新增的严格类型提示,意思是“隐式地把浮点数转成整数时丢失了精度”,比如 ~~(1.5)、(int)3.9 或直接用浮点数参与位运算、取模、数组下标等场景。它不是致命错误,但属于 E_DEPRECATED 级别,未来版本可能升级为报错甚至拒绝执行。
重点查这几类写法
以下代码在 PHP 8.1+ 中会触发该警告:
-
echo ~~($a / $b);—— 用两次按位取反模拟向下取整 -
$i = (int)$floatVal;—— 强制转换但原始值带小数 -
$arr[$floatIndex] = 'x';—— 浮点数当数组键(如1.0或2.7) for ($i = 0; $i —— 循环变量是浮点数,又用于整型上下文
推荐修复方式
核心原则:**显式处理 + 明确意图**,避免依赖隐式截断行为。
- 除法取整统一用
intdiv($a, $b)替代(int)($a / $b)或~~($a / $b) - 取模运算改用
%(仅适用于整数),或先用intdiv再算余数 - 数组下标确保是整型:
$arr[(int)round($floatKey)]或$arr[(int)floor($floatKey)],根据业务选舍入方式 - 循环计数器不用浮点步长,改用整数计数再换算:
for ($i = 0; $i
别忽略边界风险
像 ~~(PHP_INT_MAX + 0.1) 这类操作,在 PHP 8.1 前可能“碰巧”不出错,但实际已超出整型范围,结果不可靠。改用 intdiv() 或 floor() + 类型断言(如 is_int())能提前暴露问题,而不是等到数据异常才浮现。
立即学习“PHP免费学习笔记(深入)”;
临时兼容(不推荐长期用)
若项目量大需分批改造,可在出问题的表达式前加类型检查或兜底:
$int = is_float($x) ? (int)floor($x) : (int)$x;- 或启用错误抑制(仅调试期):
@(int)$x—— 但会掩盖真实问题,上线前必须清理
不复杂但容易忽略



















