在PHP中将大整数转换为完整字符串

9

我已经搜索了一段时间,但是找到的不是我需要的。我需要将一个可能非常大的整数值转换为字符串。听起来很简单:"$var"?不,因为这可能会导致数字的E+表示。

<?php

$var = 10000000000000000000000000;
echo $var."\n";
echo "'$var'\n";
echo (string) $var."\n";
echo strval($var);

?>

1.0E+25
'1.0E+25'
1.0E+25
1.0E+25

我该如何使输出变为10000000000000000000000000

3
请注意,您的“非常大的整数”在计算机中并不以整数形式表示,因为它超出了32位和64位的界限。 - thetaiko
1
$var = '10000000000000000000000000'; $var = '10000000000000000000000000'; - Ryan Kempt
你不能使用本地整数值来完成此操作,必须将其存储为字符串。如果您要对此数字执行数学运算,则必须使用bcmath库。 - Marc B
请注意,如果您正在从JSON解码大整数,则可以将JSON_BIGINT_AS_STRING用作第4个参数传递给json_decode函数。 - jchook
4个回答

9
这不是由PHP存储为整数,而是浮点数,这就是为什么最终会得到1.0E+25而不是10000000000000000000000000的原因。
很遗憾,在PHP中无法将其用作整数值,因为PHP无法保存那么大的整数。如果这来自数据库,则它将是一个字符串,您可以随意处理它。如果将其存储在其他地方,请将其存储为字符串。
您的替代方案是将其存储为浮点数,并始终考虑到这一点,尽管这需要在某些地方进行额外的转换和处理。
还建议使用GNU Multiple Precision,但这在PHP中默认未启用。
$int=gmp_init("10000000000000000000000000");
$string=gmp_strval($int);
echo $string;

我正要建议使用GMP。不要使用浮点数 - 在那么大的数字上精度不可靠。 - AndrewR

5

更新: 找到了下一篇文章:

// strval() will lose digits around pow(2,45);
echo pow(2,50); // 1.1258999068426E+015
echo (string)pow(2,50); // 1.1258999068426E+015
echo strval(pow(2,50)); // 1.1258999068426E+015

// full conversion
printf('%0.0f',pow(2,50)); // 112589906846624
echo sprintf('%0.0f',pow(2,50)); // 112589906846624

使用printf或者sprintf


我在未添加答案的第二部分之前错误地提交了它。 - Ofir Baruch
浮点数在这个范围内不可靠。在我的系统上,echo sprintf("%0.0f", 10000000000000000000000000); 输出 10000000000000000905969664 - AndrewR

4

在获取Facebook ID并在MySQL中查找时,我遇到了这个问题。经过半个小时的尝试,我发现以下方法完美解决了问题!请将以下行插入您的PHP脚本:

ini_set('precision',30);

来源:https://forums.phpfreaks.com/topic/125907-solved-convert-big-number-to-string/#entry651084

这篇帖子讨论了如何将大数字转换为字符串。当数字超出PHP整数类型的范围时,可以使用GMP扩展或BC Math扩展来进行转换。GMP扩展适用于较大的数字,而BC Math扩展适用于更高的精度。


经过一整天的努力,我终于找到了这个技巧。它救了我的命。感谢Duo。 - kamatchi

2
您想要表达的整数数字是:
$var = 10000000000000000000000000;

该功能在您的系统上不可用。由于它太大,因此PHP将其转换为浮点数,这会改变数字(例如32位系统):

       10000000000000000905969664

常见的限制包括:

 yours :  10 000 000 000 000 000 000 000 000
 32 bit:                       2 147 483 648
 64 bit:           9 223 372 036 854 775 808

数值的变化被称为浮点精度,PHP整数手册会告诉您整数限制和浮点精度页面(请参阅大红色警告)。根据您所使用的系统,您可以使用应用程序需要的范围编译PHP,或者您必须使用另一种数据类型,例如gmp库,它能够将字符串作为整数数字并处理它们。
以下示例仅显示输出,但您可以执行乘法等操作:
$r = gmp_init('10000000000000000000000000');
echo gmp_strval($r);

希望这对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接