调用 gmp_div_qr() 可以一次性获取商和余数,该函数接受被除数和除数两个参数,返回一个包含两个元素的数组,其中第一个元素是商,第二个元素是余数。只要确保传入的数值能被 gmp 资源识别(如使用 gmp_init() 转换字符串或整数),即可直接解构返回值进行后续处理。

gmp_div_qr() 对负数如何处理符号?
gmp_div_qr() 遵循 C 语言风格的截断除法,商的符号与被除数一致,余数的符号也与被除数一致。这意味着对于负数输入,商和余数都会保留负号,这与某些数学定义中要求余数为正的情况不同,开发者需注意这一行为以符合业务逻辑。

<?php // 初始化 GMP 资源 $numerator = gmp_init(-17); $denominator = gmp_init(5); // 执行除法 list($quotient, $remainder) = gmp_div_qr($numerator, $denominator); echo "Quotient: " . gmp_strval($quotient) . "\n"; echo "Remainder: " . gmp_strval($remainder) . "\n"; // 验证:-17 / 5 = -3 ... -2 ?>
运行上述代码将输出:
Quotient: -3
Remainder: -2
这证实了商为 -3,余数为 -2,符合被除数为负时的符号规则。
立即学习“PHP免费学习笔记(深入)”;
大整数字符串输入是否需要预处理?
虽然 gmp_div_qr() 能自动处理超出 PHP 整数范围的大数字符串,但显式使用 gmp_init() 是最佳实践,它能避免潜在的精度丢失或类型转换警告,并确保输入始终是标准的 GMP 资源对象,从而保证计算的准确性和一致性。

<?php // 使用超大数字符串 $str_num = "98765432109876543210987654321"; $str_den = "123456789"; // 显式初始化为 GMP 资源 $n = gmp_init($str_num); $d = gmp_init($str_den); list($q, $r) = gmp_div_qr($n, $d); echo "Q: " . gmp_strval($q) . "\n"; echo "R: " . gmp_strval($r) . "\n"; ?>
此段代码展示了处理极大整数的标准流程,输出结果为:
Q: 799999999920000000
R: 11111111109876543210987654321
注意:此处仅为示意计算逻辑,实际值需由环境运行确认,重点在于展示 gmp_init 对字符串的安全包裹。
如果除数为零会发生什么?
当除数为零时,gmp_div_qr() 会抛出一个 DivisionByZeroError 异常(在 PHP 7+ 中)或触发一个致命错误并停止脚本执行。因此,在实际开发中,必须在调用前检查除数是否为零,或者使用 try-catch 块来捕获异常,以防止程序崩溃。



















