
<?php
$a = "9999888877776666555544443333322222111110000000000000000000000000000";
$b = "1000236540001";
//计算两字符串长度,并获取最长字符串长度
$a_len = mb_strlen($a);
$b_len = mb_strlen($b);
$a_len >= $b_len ? $total_len =$a_len:$total_len = $b_len;
//将两串字符串补全到最长字符串长度,左边以字符串"0"补全
$a_new = str_pad($a,$total_len,'0',STR_PAD_LEFT);
$b_new = str_pad($b,$total_len,'0',STR_PAD_LEFT);
//将两字符串 按照字符单元拆分,分别存储到对应的数组当中
$a_str_array = array();
$b_str_array = array();
for($i=$total_len-1;$i>=0;$i--){
$target_str_a = "";
$target_str_b = "";
$target_str_a = mb_substr($a_new,$i,1);
$target_str_b = mb_substr($b_new,$i,1);
$a_str_array[] = $target_str_a;
$b_str_array[] = $target_str_b;
}
//如上循环可换做str_split()改写 例:$c_array= str_split("Shanghai",3)
$new_combine_array = array();
//循环上面的数组 按相同索引对应元素值进行数值加减运算(如果是减法法则需要从高位往低位运算,如果是加法则需要从低位往高位运算),并进行进位处理,然后将运算值存储到新的数组当中
for($n=0;$n<=$total_len;$n++){
$n_digit = intval($a_str_array[$n])+intval($b_str_array[$n]);
if($n_digit>=10){
//如果当前位两数值相加大于等于10 ,则需要进位,处理办法是任选一个之前的拆分数组$a_str_array 或 $b_str_array,将其第$n+1个元素加1(有可能使该元素值等于10)
$n_digit = $n_digit-10;
//$n_digit -= 10;
$a_str_array[$n+1] = strval(intval($a_str_array[$n+1])+1);
}
$new_combine_array[$n] = $n_digit;
}
//将拆分运算后的数组进行拆分拼接
$new_combine_str = "";
$new_combine_array_length = count($new_combine_array);
for($m=$new_combine_array_length-1;$m>=0;$m--){
//判断最高位字符串是否为"0",若为"0"则不拼接
$m ==$new_combine_array_length-1 && $new_combine_array[$new_combine_array_length-1]=="0"?$new_combine_str = $new_combine_str:$new_combine_str .= $new_combine_array[$m];
}
echo $new_combine_str;
?>
方法二:
function big_number($num1,$num2){
$num1 = rtrim($num1,"0");
$num1 = rtrim($num1,".");
$num2 = rtrim($num2,"0");
$num2 = rtrim($num2,".");
$len1 = strlen($num1);
$len2 = strlen($num2);
$diff1 = $len1 - (strpos($num1,".")?:$len1);
$diff2 = $len2 - (strpos($num2,".")?:$len2);
$char_index1 = strpos($num1,".")?:$len1;
$char_index2 = strpos($num2,".")?:$len2;
$diff = abs($diff1 - $diff2);
$char_index = $diff1 > $diff2 ? $diff1 : $diff2;
if($diff1 > $diff2){
$num2 = str_pad($num2,$len2 + $diff,"0",STR_PAD_RIGHT);
}else{
$num1 = str_pad($num1,$len1 + $diff,"0",STR_PAD_RIGHT);
}
$num1 = str_replace(".","",$num1);
$num2 = str_replace(".","",$num2);
$len1 = strlen($num1);
$len2 = strlen($num2);
$len = $len1 > $len2 ? $len1 : $len2;
$num1 = str_pad($num1,$len,"0",STR_PAD_LEFT);
$num2 = str_pad($num2,$len,"0",STR_PAD_LEFT);
$arr1 = str_split($num1);
$arr2 = str_split($num2);
$arr = [];
$mod = 0;
for($i = $len - 1;$i >= 0;$i--){
$num = (int)$arr1[$i] + (int)$arr2[$i] + $mod;
if($num >= 10){
$num -= 10;
$mod = 1;
}else{
$mod = 0;
}
array_unshift($arr,$num);
}
$num = implode("",$arr);
if($char_index > 0){
$num = substr($num,0,strlen($num) - $char_index + 1).".".substr($num,1 - $char_index);
$num = rtrim($num,"0");
$num = rtrim($num,".");
}
return $num;
}
$num1 = "1423547535454.34859347895";
$num2 = "543789538243290874093.545";
$num = big_number($num1,$num2);
echo $num;