大数会超出int表示的范围,所以不能直接相加。如果安装了BCMath扩展,可以使用bcadd来计算。否则需要模拟手工计算加法。
代码如下
<?php
echo big_add('9999999999999999', '25'), "\n";
echo bcadd('9999999999999999', '25'), "\n";
function big_add($num1, $num2)
{
//用len1暂存num1的长度
$len1 = strlen($num1);
if (0 == $len1) {
//如果num1的长度为0,则num1为0,和为num2的值
return $num2;
}
//用len2暂存num2的长度
$len2 = strlen($num2);
if (0 == $len2) {
//如果num2的长度为0,则num2为0,和为num1的值
return $num1;
}
//取出较长的数字长度
$len = $len1 > $len2 ? $len1 : $len2;
//用result存储结果
$result = '';
//进位标志
$carry_flag = 0;
for ($i = $len - 1; $i >= 0; $i--) {
//保存每个位的加数和被加数
$add1 = $add2 = 0;
if ($len1 > 0) {
//如果还未取完num1,则取出当前位置的数字,并把游标前移
$add1 = $num1[--$len1];
}
if ($len2 > 0) {
//如果还未取完num2,则取出当前位置的数字,并把游标前移
$add2 = $num2[--$len2];
//每位都是num1和num2同一位置的数字之和加上进位
}
$tmp = $add1 + $add2 + $carry_flag;
if ($tmp >= 10) {
//判断加完之后的和,如果大于等于10,则取余数,并设置进位标志为1
$result = ($tmp - 10) . $result;
$carry_flag = 1;
} else {
//如果小于10,则取当前值,并设置进位标志为0
$result = $tmp . $result;
$carry_flag = 0;
}
}
if (1 == $carry_flag) {
//如果进位标志为1,则最高位为1,需要拼接上
$result = $carry_flag . $result;
}
return $result;
}