提问人:Emilio Galarraga 提问时间:6/26/2021 最后编辑:Emilio Galarraga 更新时间:6/29/2021 访问量:370
PHP精度与大数字
php precision with big numbers
问:
我有 2 个大数字,这些数字的总和必须是
我正在使用 php 5.6 并将 precision 参数设置为 16,但 php 仍然显示不正确的输出。1133853003571025.63
1732254953579959.21
2866107957150984.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?
答:
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 示例。我会把它添加到答案中。
上一个:PHP 浮点数、对象和精度
下一个:PHP 舍入浮点数
评论