如何获取大整数平方根的小数部分?PHP GMP相关技术问题
获取大整数平方根的小数部分(PHP GMP实现)
gmp_sqrt() 仅返回平方根的整数部分,要获取小数部分,你可以用逐位迭代的方式计算,下面是一个可指定精度的实现示例:
代码实现
<?php $y2 = gmp_init('28626386478758000000000000909090904'); $integer_part = gmp_sqrt($y2); // 计算原数与整数部分平方的差值(余数) $remainder = gmp_sub($y2, gmp_pow($integer_part, 2)); // 设置要保留的小数位数 $decimal_places = 10; $decimal_part = ''; $current_remainder = $remainder; for ($i = 0; $i < $decimal_places; $i++) { // 余数乘100,为下一位小数计算做准备 $current_remainder = gmp_mul($current_remainder, 100); // 找到最大的d,满足 (2*整数部分*10 + d)*d ≤ 当前余数 $d = 0; $two_times_int = gmp_mul($integer_part, 20); while (gmp_cmp(gmp_add(gmp_mul($two_times_int, $d), gmp_pow($d, 2)), $current_remainder) <= 0) { $d++; } $d--; // 记录当前小数位 $decimal_part .= strval($d); // 更新余数 $current_remainder = gmp_sub($current_remainder, gmp_add(gmp_mul($two_times_int, $d), gmp_pow($d, 2))); } // 输出完整结果 echo "Square root is: " . gmp_strval($integer_part) . "." . $decimal_part . "\n"; ?>
逻辑说明
- 先用
gmp_sqrt得到平方根的整数部分,再计算原数与整数部分平方的余数,这是小数部分计算的核心依据。 - 循环逐位生成小数:每次将余数乘100,然后找到符合条件的数字d,作为当前小数位;之后更新余数,继续下一位的计算。
- 你可以通过修改
$decimal_places的值来调整小数部分的精度。
内容的提问来源于stack exchange,提问作者Asif Iqbal
相关产品推荐
相关产品推荐

