<?php
$a = 1222222222122222222212222222221222222222122222222212222222221222222222122222222212222222221222222222;
$b=  3333333331333333333133333333313333333331333333333133333333313333333331333333333133333333313333333331;
$a = numToStr($a);// sprintf("%s",$a);//(string)$a;
$b =numToStr($b);

echo "<pre>";
print_r(bb(aa((string)$a,(string)$b)));

function bb($data){
    $string="0";
    foreach ($data as $k=>$v){
        $string = bcadd($string,$v);
    }
    return $string;
}


function aa($a,$b){
    $len= strlen($b);
    $data=[];
    for($i=$len-1;$i>=0;$i--){
        $data[]=bcmul($a,$b[$i]).str_repeat(0,$len-1-$i);
    }
    return $data;
}

function numToStr($num)
{
    $result = "";
    if (stripos($num, 'E') === false) {
        return $num;
    }
    while ($num > 0) {
        $v = $num - floor($num / 10) * 10;
        $num = floor($num / 10);
        $result = $v . $result;
    }
    return $result;
}

 两个特大数相乘

php.ini 里 precision=14 默认值 需要改大点

php解决方案(精度上会有丢失)

思路上大致就是这么做的:计算机精度最大在64位 所以最后转化为字符串去相乘,把$a看成一个整体,$b拆成一个一个的数去相乘$a,末尾补0。最后在把这些数相加!

相关文章: