如何将输出作为整数?

时间:2017-01-02 13:08:08

标签: php floating-point gmp bcmath

输入将由许多数字对组成,每个数字对在一个单独的行上,数字用逗号分隔。数字可以长达100位。数字将是整数和派系数字,负数字不会输入。输入将在文件结束时终止。

输出将是每个单独行的反向总和。对于每个输入对,应该有一个反向和。

我正在编写此代码,但未将正确的结果作为整数值

$number="36222813552166588601325554186418874001226412488844274840066661514,32814873748120642422248240335447
";
$int_array = array_map("intval", explode(",", $number));

$sum=0;
foreach($int_array as $item)
{
    $sum=$sum+strrev($item);        
}
$reverse_sum=str_replace("0","",strrev($sum));
echo $reverse_sum;

得到输出:91+E562719451714.1

预期输出:68046696201386131133563894412955974001226412488844274840066661514

2 个答案:

答案 0 :(得分:2)

PHP中的所有数字都限制在系统WORD大小,即32位(PHP_INT_MAX = 2147483647)或64位(PHP_INT_MAX = 9223372036854775807)。任何评估为大于此限制的数字都将转换为浮点小数。

考虑使用BCMath,它以十进制(人类可读)形式而不是二进制形式存储数字作为字符串,因此它们几乎可以无限长:

$input = "36222813552166588601325554186418874001226412488844274840066661514,32814873748120642422248240335447";
$numbers = explode(",", $input);
$sum = "0";
foreach($numbers as $num){
    $sum = bcadd($sum, $num);
}

$reversed = str_replace("0", "", strrev($sum));
echo $reversed;

输出:169699638879668496611618698146814555231688566125531822263

根据您提供的代码,我不知道您将如何达到预期的输出。我也不明白为什么你要删除零。 (也许你想用ltrim(strrev($sum), "0")代替?结果将是16969960388079668490606100161860981468145552310688566125531822263,这不是你想要的。

如果您有十进制数字,请考虑在输入中添加第四个参数。

答案 1 :(得分:0)

您可以使用BCMath或GMP。要么您需要安装必要的扩展。例如,使用GMP进行操作:

$number="36222813552166588601325554186418874001226412488844274840066661514,32814873748120642422248240335447";
$int_array = explode(",", $number);

$sum = 0;
$gmp_sum = gmp_init('0');

foreach($int_array as $item)
{
        $gmp_sum = gmp_add($gmp_sum, strrev($item));
        $sum     = $sum+strrev($item);
}
$original_reverse_sum = str_replace("0","",strrev($sum));
$gmp_reverse          = str_replace("0", "", strrev(gmp_strval($gmp_sum)));

 echo "Original Reverse Sum: $original_reverse_sum \n";
 echo "GMP result: $gmp_reverse\n";

输出:

  

原始反向总和:46 + E74846666151.4

     

GMP结果:68466962138613113356389441295597412264124888442748466661514

我猜你正在做的是某种练习,因为我不清楚为什么你想要这种输出,但这应该有效。