PHP精度与大数字

php precision with big numbers

提问人:Emilio Galarraga 提问时间:6/26/2021 最后编辑:Emilio Galarraga 更新时间:6/29/2021 访问量:370

问:

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

我得到的输出是: 数字 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 apache2 精度

评论

0赞 Chris Haas 6/27/2021
您可能应该通读以下内容: stackoverflow.com/a/588014/231316

答:

1赞 Code4R7 6/27/2021 #1

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

PHP 中的浮点值精度有限。使用浮点数进行计算时要考虑在内。PHP_FLOAT_EPSILON

如果所有这些都不符合您的需求,请查看 bcmath 扩展以获取任意精度。你可以这样使用它:

$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'

评论

0赞 Emilio Galarraga 6/28/2021
谢谢你的回答。我尝试将数字存储在数据库中,然后再添加它们。但是,即使使用双精度数据类型,数字也会错误地存储。在网上搜索,我发现这个页面可以正确进行计算,https://keisan.casio.com/calculator。我只是不知道它是如何制作的,以及它适用于哪种编程语言。
0赞 Code4R7 6/28/2021
我用 bcadd 的代码示例更新了答案,该示例返回您需要的输出。
0赞 Emilio Galarraga 6/28/2021
感谢您的帮助,php脚本很好。sql 语句适用于 mysql,但我使用 postgresql。postgres=# SELECT CAST(1133853003571025.63 + 1732254953579959.21 AS CHAR) AS bignumber; bignumber ----------- 2 (1 row)
0赞 Emilio Galarraga 6/29/2021
SELECT CAST(1133853003571025.63 + 1732254953579959.21 AS CHAR(19)) AS bignumber;它有效。
0赞 Code4R7 6/29/2021
很高兴它奏效了。虽然PostgreSQL在使用MySQL很长一段时间后已成为我的偏见,但许多人仍在使用MySQL / MariaDB。感谢您添加 PostgreSQL 示例。我会把它添加到答案中。