格式化长数字时,PHP 给出不正确的结果

标签 php integer number-formatting biginteger arbitrary-precision

我正在为网站目的处理大量数据,我需要进行长时间的计算。当我回显一个长数字时,我没有得到正确的输出。

示例

// A random number
$x = 100000000000000000000000000;

$x = number_format($x);
echo "The number is: $x <br>";
// Result: 100,000,000,000,000,004,764,729,344 
// I'm not getting the value assigned to $x

最佳答案

您的数字对于 php 标准整数来说实际上太大了。 php 使用 64 位整数,可以保存 -9223372036854775808 范围内的值 (PHP_INT_MIN) 至 +9223372036854775807(PHP_INT_MAX)。

您的数字大约有 87 位长,这实在是太多了。

如果你真的需要这么大的数字,你应该使用 php BC 数学类型,在手册中有解释:http://php.net/manual/en/ref.bc.php

如果你只是想格式化一个像一个巨大的数字一样的字符串,那么使用这样的东西:

function number_format_string($number) {
    return strrev(implode(',', str_split(strrev($number), 3)));
}

$x = '100000000000000000000000000';

$x = number_format_string($x);
echo "The number is: $x\n";

// Output: The number is: 100,000,000,000,000,000,000,000,000

编辑: 添加了 strrev() 函数,因为字符串在拆分之前需要反转(感谢@ceeee 的提示)。这样可以确保当输入的长度不能被 3 整除时,分隔符位于正确的位置。生成的字符串之后需要再次反转。

可在 http://sandbox.onlinephpfunctions.com/code/c10fc9b9e2c65a27710fb6be3a0202ad492e3e9a 找到工作示例

关于格式化长数字时,PHP 给出不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35169951/

相关文章:

php - 在 mysql 中检测逗号分隔字段中的重复值

将字符数组转换为整数

javascript - 如何将大整数拆分为 8 位整数数组

php - 使用 SQL 和 php 创建网站使用情况的每周和每月图表

php - Mysql:将数据数组存储在单个列中

PHP计算时间差,结果错误1小时

Java 从不同的类中普遍加载整数

ios - 将小数格式化为在最后一个零之后有四个非零数字

javascript - 在javascript中将数字转换为带两位小数的逗号分隔格式

algorithm - 如何用少于 2*n 个字符表示一个 n 字节的数组