php 大数字的精度

php precision with big numbers

我有 2 个大数字 1133853003571025.631732254953579959.21 这些数字的总和必须是 2866107957150984.84
我正在使用 php 5.6 并将精度参数设置为 16,但仍然 php 显示不正确的输出。

我得到的输出是:
号码 1:1133853003571026
号码 2:1732254953579959
总和:2866107957150985
数字 1(格式):1133853003571025.75
数字 2(格式):1732254953579959.25
总和(格式):2866107957150985.00
号码长度:16

我的密码是

<?
$num01=1133853003571025.63;
$num02=1732254953579959.21;
$longitud= strlen($num01);
echo "number 1: ".$num01."<br>";
echo "number 2: ".$num02."<br>";
echo "Sum : ".($num01+$num02)."<br>";
echo "number 1 (format): ".number_format($num01, 2, '.', '')."<br>";
echo "number 2 (format): ".number_format($num02, 2, '.', '')."<br>";
echo "Sum (format): ".number_format(($num01+$num02), 2, '.', '')."<br>";
echo "<b>number length: </b>".$longitud."<br>";
?>

My question is what is wrong?, what is missing in my code?

PHP 静默地将太大 PHP 无法处理 (> PHP_INT_MAX) 的整数转换为浮点数。这是设计使然。

PHP 中的浮点值有 limited precision。使用浮点数进行计算时考虑 PHP_FLOAT_EPSILON

如果这一切都不符合您的需要,请查看 bcmath extention 以获得任意精度。你可以这样使用它:

$a = '1133853003571025.63';
$b = '1732254953579959.21';
print bcadd($a, $b, 2);  // output: '2866107957150984.84'

使用 bcmath 的替代方法是让数据库进行计算,您可以在 SQL SELECT 语句中传递计算并检索结果。看看 PDO.

MySQL / MariaDB 示例查询:

SELECT CAST(1133853003571025.63 + 1732254953579959.21 AS CHAR) AS bignumber;
  -- result: '2866107957150984.84'

PostgreSQL 示例查询:

SELECT (1133853003571025.63 + 1732254953579959.21)::text AS bignumber;
  -- result: '2866107957150984.84'