fdiv 是 PHP 8.0 引入的 IEEE 754 兼容浮点除法函数,对无穷大、NaN、零等特殊值有明确定义;当被除数非零且除数为 ±0.0、或被除数为 ±INF 且除数为有限非零值时返回 INF/-INF;应使用 is_infinite() 和 is_nan() 安全检测,而非直接比较。

fdiv 是 PHP 8.0 引入的专用浮点除法函数,它严格遵循 IEEE 754 标准,对特殊值(如无穷大、NaN、零)有明确定义。当除法结果为无穷大(INF 或 -INF)时,fdiv 不会报错或静默截断,而是直接返回对应符号的无穷大值——这是它的设计特性,不是异常,需主动检测和处理。
什么时候会得到 INF/-INF?
以下情况调用 fdiv($a, $b) 会返回无穷大:
- 被除数为非零有限值,除数趋近于 0(正负号决定 INF 符号):如
fdiv(1.0, 0.0)→INF;fdiv(-1.0, 0.0)→-INF - 被除数为 ±INF,除数为有限非零值:如
fdiv(INF, 2.0)→INF - 被除数为有限非零值,除数为 ±0.0(注意:PHP 中
0.0和-0.0是不同值):如fdiv(5.0, -0.0)→-INF
如何安全检测和处理无穷大结果?
不能依赖 == 或 === 直接比较 INF(因为 INF === INF 成立,但易误判),推荐使用内置函数:
- 用
is_infinite($result)判断是否为 ±INF(返回布尔值) - 用
is_nan($result)排除 NaN(如fdiv(0.0, 0.0)或fdiv(INF, INF)) - 结合
signbit($result)(PHP 8.2+)或$result 判断符号 - 示例处理逻辑:
$res = fdiv($a, $b);<br>if (is_infinite($res)) {<br> if ($res > 0) { /* 处理 INF */ } else { /* 处理 -INF */ }<br>} elseif (is_nan($res)) { /* 处理无效运算 */ } else { /* 正常结果 */ }
要不要提前避免 INF?
取决于业务场景。若除数可能为 0 或极小值,可前置校验:
立即学习“PHP免费学习笔记(深入)”;
- 检查除数绝对值是否低于安全阈值(如
abs($b) ),再决定跳过计算或抛出自定义异常 - 注意:仅判断
$b == 0.0不够,因为-0.0 != 0.0在松散比较中为 true,但fdiv(1.0, -0.0)仍得-INF;建议用abs($b) 或 <code>is_finite($b) && $b == 0.0组合判断 - 数值计算密集型场景(如物理模拟、金融模型),通常保留 INF 并在后续逻辑中统一处理更高效;交互式表单等场景则更适合前置拦截并提示用户
和传统除法 / 的关键区别
普通除法 / 在整数上下文中可能触发 DivisionByZeroError(PHP 8.0+),或返回 INF(浮点上下文),行为不一致;而 fdiv 始终执行浮点运算,且对所有输入组合(包括 0.0、INF、NaN)都返回明确定义的结果,无运行时错误。这意味着你必须自己承担结果校验责任,不能假设“没报错就是正常值”。



















