<?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。最后在把这些数相加!