产品未正确计算(PHP)

时间:2018-01-25 11:36:40

标签: php

<?php 
    ini_set('display_errors','1'); 
    error_reporting(E_ALL);
    include_once 'dbConnect.php';

    if (connect()){
        global $conn;

        $queryProduct = "SELECT group_concat(candName) FROM testFacRep";    

        $productResult = $conn->query($queryProduct);
        $productResult = mysqli_fetch_row($productResult);
        $data = $productResult[0];

        $cipher = explode(",", $data);

        function product($carry, $item){
            $carry *= $item;
            return $carry;
        }
    }

    echo json_encode (number_format(array_reduce($cipher, "product", 1), 0, '.', ''));
?>

测试值为:66300, 170254, 175133, 8226, 82793

我使用在线计算器来了解产品是否正确。正确的产品是1346359888376293931758800。

但是,PHP提供的产品是1346359888376294113542144。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

你超过2 ^ 31,开始变得有点不稳定;不要担心你是第一个遇到这个问题的人。

PHP附带了一个名为GMP

的简洁小库

使用gmp_mul我们可以获得您需要的值。

$ints = array(66300,170254,175133,8226,82793);

$output = 1;
foreach($ints as $i){
    $output = gmp_mul($output,$i);
}

print_r($output);

输出:GMP Object ( [num] => 1346359888376293931758800 )
3v4l link

答案 1 :(得分:0)

你所面临的问题在integers的php文档中得到解释:&#34;整数的大小取决于平台,尽管最大值约为20亿是通常的值(& #39; s 32位签名)。 64位平台的最大值通常约为9E18,除了PHP之前的Windows,它总是32位。 PHP不支持无符号整数。整数大小可以使用常量PHP_INT_SIZE确定,最大值使用自PHP 5.0.5起的常量PHP_INT_MAX,使用自PHP 7.0.0起使用常量PHP_INT_MIN的最小值。&#34;

您还可以使用bc_math lib

<?php

$res = 1;
foreach ([66300, 170254, 175133, 8226, 82793] as $op) {
    $res = bcmul($res, $op);
}

echo $res; //1346359888376293931758800