【问题标题】:PHP: How to convert bigint from int to string?PHP:如何将 bigint 从 int 转换为 string?
【发布时间】:2011-08-22 17:35:00
【问题描述】:

我希望能够将大整数转换为其完整的字符串导数。

例如。

$bigint = 9999999999999999999;
$bigint_string = (string) $bigint;
var_dump($bigint_string);

输出

string(7) "1.0e+19"

但我需要

string(19) "9999999999999999999"

请不要告诉我,我最初应该将 $bigint 值设置为字符串。这不是一个选择。我真的被卡住了,不知道这是否可能?

【问题讨论】:

  • 精度已丢失。这超出了浮点数的范围。你不会得到你想要的字符串输出。
  • 我想唯一的方法就是最初转换为字符串。球。
  • 如果你解释了用例而不是你想要的,可能会得到更相关的答案。
  • 我在您的代码中看不到整数。应该在哪里?
  • @hakre - 抱歉。我没有意识到大整数会是一个浮点数。我以前从未处理过这么大的数字。

标签: php string biginteger


【解决方案1】:

你实际上应该确保你输入的意思是:

$bigint = 9999999999999999999;

不是 PHP 整数而是浮点数:

float(1.0E+19)

如果你会这样做

$bigint = (int) 9999999999999999999;

实际上,您会设置一个整数,但它可能不是您预期的数字:

int(-8446744073709551616)

你可能已经猜到了,把它变成字符串完全没有问题。因此,当您将数字写入代码时,请注意您实际上写的是您的意思。

再次看到这一行:

$bigint = 9999999999999999999;

试着理解你实际写了什么。它根本不是整数,因为 PHP 会将它变成浮点数。请参阅integer manual page 中的示例 #4 64 位系统上的整数溢出。

如果您需要更高的精度,请查看GNU Multiple Precision,它可能会满足您的需求。但是,这不会改变 PHP 中数字的书写方式:

$bigint = gmp_init("9999999999999999999");
$bigint_string = gmp_strval($bigint);
var_dump($bigint, $bigint_string);

输出:

resource(4) of type (GMP integer)
string(19) "9999999999999999999"

【讨论】:

  • 感谢 hakre 的深入回复。我想我还有很多东西要学。
  • gmp_init() 需要以字符串或 int 开头——而不是浮点数。这意味着,如果您已经将它保存在字符串或 int 中,则不需要 gmp。
  • @buggedcom:不客气。总有新东西要学;)
  • 如果你这样传递它就行不通了:$bigint = gmp_init(9999999999999999999);
  • @PhillPafford:将数字作为整数或字符串传递,而不是浮点数。
【解决方案2】:

使用strval()

echo strval($bigint); // Will output "99999999999999999"

编辑:经过稍微更好的研究(> 5000ms),我发现不可能将数字回显到那个精度,因为 PHP 无法保存那个大小的整数(取决于 OS 位系统,32/64)。似乎不可能在不丢失精度的情况下做到这一点。

【讨论】:

  • @Evan ;) 5 秒的 Google 搜索。
  • 对不起,这与通过 (string) 将其转换为字符串相同,它不起作用。它只会输出 1.0E+19
  • 其实它调用_toString(),这不一样。但是strval 应该有效。
  • @Evan - 你使用什么版本的 PHP 来工作?你自己测试过吗?
  • 不过,您可以使用第三方库。见stackoverflow.com/questions/211345/…
【解决方案3】:

使用printf(),它就是为此而生的:

echo printf("%d", $bigint);

【讨论】:

  • 这不适用于大于 32 位的值。 (或 64,无论哪种情况。)
【解决方案4】:

只需将值存储为字符串并显示...!

   $bigint = '9999999999999999999';

    var_dump($bigint);

输出:

string(19) "9999999999999999999"

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2011-05-05
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2011-05-29
    • 2011-11-19
    相关资源
    最近更新 更多