PHP number_format 返回不正确的数字

Posted

技术标签:

【中文标题】PHP number_format 返回不正确的数字【英文标题】:PHP number_format returning incorrect number 【发布时间】:2014-03-11 13:24:33 【问题描述】:

目前我有一个 19 位数长的数字,当我尝试打印它时,它会给我科学计数法,这正是我不需要的,因为这是一个特定的 ID 而不是数字。

我已经通过使用 number_format() 来抵消这一点,但是由于处理数字和我正在执行的处理量,加载时间增加了,并且最后 4 位数字不正确,因此数字很大。我的环境有限,因此可能无法加载其他模块,我最好的选择是什么?

仅举个例子:

$cid = 8162315223029015401;
$cid1 = sprintf($cid);
$cid2 = number_format($cid, 0, '.', '');
echo gettype($cid);
echo $cid1;
echo $cid2;

>> double
>> 8.162315223029E+18
>> 8162315223029015552

提前致谢!

谢谢大家,问题是 x32 系统上的最大长度。 Is there any way to maximize php_INT_MAX?

【问题讨论】:

您期望的格式是什么? echo 的预期输出应该是“8162315223029015401”,我正在页面上显示此数据。 number_format() 期望它的第一个参数是一个浮点值,这意味着你正在修改你的 int。 32 位还是 64 位 PHP? 最好使用 sprintf 处理浮点问题,例如显示指数值!! 【参考方案1】:

使用字符串; $cid = "8162315223029015401";

【讨论】:

没关系。 number_format() 需要一个浮点数。传入一个 int 或 int-as-string 只会“浮动化”数字并破坏较低的有效数字 数据来自一个对象,使用 settype($cid, "string") 仍然产生科学记数法,有什么想法吗? 但它只需要打印出来,所以我们可以省略number_format?否则我没有正确理解这个问题。 PHP 处理这些大整数存在问题,要使其更复杂,取决于您使用的是 32 位还是 64 位操作系统。请参阅this answer 了解更多信息。【参考方案2】:

使用 sprintf:

$cid = 8162315223029015401;
$cid1 = sprintf("%.8f", $cid);
$cid2 = number_format($cid, 0, '.', '');
echo gettype($cid) . PHP_EOL;
echo $cid1 . PHP_EOL;
echo $cid2 . PHP_EOL;

输出:

integer
8162315223029015552.00000000
8162315223029015552

【讨论】:

以上是关于PHP number_format 返回不正确的数字的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用 number_format 并正确显示小数点

js 实现类似php函数number_format的功能

PHP字符串函数 number_format(以千位分隔符方式格式化一个数字)

php number_format() 的问题

PHP number_format() 十进制 .99 变为 .00

php number_format用法(代码实例)