fdiv() 按 IEEE 754 规范处理除零,返回 INF、-INF 或 NAN 而不抛异常;它强制 float 输入,整数自动转换,null 或非法字符串触发 TypeError;检测 NAN 必须用 is_nan()。

fdiv() 直接返回 INF 或 -INF,不抛出 DivideByZeroError —— 这是它和普通除法 / 的根本区别。你不需要 try/catch,也不用提前判断 $b === 0.0,函数内部已按 IEEE 754 规范处理符号与无穷性。
为什么 fdiv(1.0, 0.0) 返回 INF 而不是报错
因为 fdiv() 是 IEEE 754-compliant 的浮点除法实现,把除零视为定义良好的极限行为:正数 ÷ +0.0 → INF,负数 ÷ +0.0 → -INF,0.0 ÷ 0.0 → NAN。而 PHP 原生 / 运算符在整数上下文或某些 ZTS 模式下可能触发 DivisionByZeroError(尤其当操作数被隐式转为 int 时),但 fdiv() 始终强制 float 输入并跳过该检查。
注意:fdiv() 不接受整数类型提示以外的参数;传入 int 会自动 cast 为 float,但若传入 null 或 string 且无法转 float(如 "abc"),会触发 TypeError。
fdiv(0.0, 0.0) 和 fdiv(NAN, 1.0) 都返回 NAN
这是符合预期的:IEEE 754 规定 0/0、∞/∞、0×∞、NAN 与任何数运算结果均为 NAN。常见误判是认为 fdiv(0.0, 0.0) 应该返回 1 或 0,但它实际返回 float(NAN),且 is_nan() 才能可靠检测,== 或 === 均为 false。
立即学习“PHP免费学习笔记(深入)”;
-
fdiv(0.0, 0.0)→NAN(不是INF,也不是0) -
fdiv(NAN, 2.0)→NAN -
fdiv(1.0, NAN)→NAN - 检测方式必须用
is_nan($result),不能写$result === NAN
PHP
老版本没有 fdiv(),自己模拟时最容易漏掉的是 **零的符号**:+0.0 和 -0.0 在 IEEE 754 中是不同值,影响 INF 符号。比如 fdiv(-1.0, -0.0) 应返回 INF(同号得正),但直接用 / 会因 PHP 内部表示丢失符号而统一返回 INF。
参考社区实现中的 $check 函数逻辑:
if ($b == 0.0) {
if ($a == 0.0) return NAN;
// 必须区分 +0.0 和 -0.0
$sign_a = ($a > 0) ? 1 : (($a < 0) ? -1 : (pack('d', $a) === pack('d', 0.0) ? 1 : -1));
$sign_b = ($b > 0) ? 1 : (($b < 0) ? -1 : (pack('d', $b) === pack('d', -0.0) ? -1 : 1));
return ($sign_a === $sign_b) ? INF : -INF;
}
没做这步,fdiv(1.0, -0.0) 就可能错判成 INF 而非 -INF。
真正容易被忽略的点在于:INF/-INF/NAN 的比较和序列化行为。例如 json_encode(fdiv(1.0, 0.0)) 得到的是 null,不是字符串 "INF";var_export() 会输出 INF 字面量,但 serialize() 存储的是特殊结构,反序列化后仍是有效浮点无穷值。这些边界行为不常测试,上线后才暴露。



















