php 8.4 以下版本没有内置 bcdivmod,可以通过组合使用 bcmath 扩展中的 bcdiv 和 bcmod 函数来实现向下兼容。具体做法是调用 bcdiv($num, $div, $scale) 获取商,再调用 bcmod($num, $div, $scale) 获取余数,两者结合即可得到与 bcdivmod 相同的结果。

bcdiv 和 bcmod 如何配合使用
在 PHP 8.3 及更早版本中,开发者需要手动拆分大数除法运算。核心逻辑是利用 bcdiv 计算整数商,利用 bcmod 计算模运算结果。这两个函数都支持指定小数位数(scale),确保在处理非整除情况时精度一致。

$num = '100'; $div = '7'; $scale = 0; $quotient = bcdiv($num, $div, $scale); $remainder = bcmod($num, $div, $scale); var_dump($quotient); // string(1) "14" var_dump($remainder); // string(1) "2"
上述代码展示了基本用法。输入为字符串类型的大数,输出也是字符串。这种方式完全模拟了 bcdivmod 的行为,返回一个包含商和余数的数组或分别赋值给两个变量。
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
封装兼容层函数
为了在项目中统一处理,建议将上述逻辑封装为一个辅助函数。这样可以在不同版本的 PHP 中保持 API 的一致性,避免在业务代码中重复编写拆分逻辑。

function bc_div_mod_compat($num, $div, $scale = 0) {
if (function_exists('bcdivmod')) {
return bcdivmod($num, $div, $scale);
}
$quotient = bcdiv($num, $div, $scale);
$remainder = bcmod($num, $div, $scale);
return [$quotient, $remainder];
}
$result = bc_div_mod_compat('100', '7', 0);
var_dump($result); // array(2) { [0]=> string(1) "14" [1]=> string(1) "2" }该函数首先检查是否存在原生的 bcdivmod 函数。如果存在,直接调用以利用底层优化;否则回退到 bcdiv 和 bcmod 的组合实现。这种写法确保了代码在新旧版本间的无缝切换。
处理负数和大数精度的注意事项
在使用 bcdiv 和 bcmod 时,需要注意负数的处理规则以及精度设置。PHP 的 BCMath 函数对负数的取模行为遵循特定的数学定义,可能与某些编程语言不同。此外,scale 参数必须保持一致,否则可能导致商和余数的精度不匹配,进而影响后续计算。


















