【问题标题】:PHP 5.6.12 - Return of integer incorrectPHP 5.6.12 - 整数返回不正确
【发布时间】:2015-11-12 18:36:15
【问题描述】:

以前我一直在 Linux 中使用 PHP 5.6.7 开发应用程序,但最近我切换到使用 WAMP 64 位的 Windows 环境并将 PHP 升级到 5.6.12 并遇到了一些问题。一个问题是在后端 PHP 我有一个整数数组。当我打印返回到将返回数组打印到控制台的前面时,我得到了不同的格式。那就是:

$permission->fk_org_id = [24053826281537536,24051529749102626,111];
print json_encode($permission->fk_org_id);

将以下内容返回到控制台:

0:24053826281538000
1:24051529749103000
2:111

为什么会这样?

【问题讨论】:

  • 你能把echo PHP_INT_MAX的结果贴在这里吗?
  • 看起来它们被转换为浮点数,但对于 64 位整数来说并不算大。
  • 我做了一个打印 (PHP_INT_MAX) 结果是 2147483647

标签: php


【解决方案1】:

您可能在最大 int 为 2147483647 的 32 位机器上运行脚本,因此会发生整数溢出。根据文档:

如果 PHP 遇到一个超出整数类型界限的数字,它 将被解释为浮点数。此外,一个操作 结果超出整数类型范围的数字将返回 一个浮点数。

<?php
$large_number = 2147483647;
var_dump($large_number);                     // int(2147483647)

$large_number = 2147483648;
var_dump($large_number);                     // float(2147483648)

$million = 1000000;
$large_number =  50000 * $million;
var_dump($large_number);                     // float(50000000000)
?>

您可以在documentation 中找到有关整数的更多信息。

【讨论】:

  • 谢谢我正在运行 64 位 Windows 和 64 位 WAMP 服务器,这应该发生吗?
【解决方案2】:

这些数字太大而无法放入(32 位)整数中。它们将被解释为浮点数,请参阅documentation

如果 PHP 遇到超出整数类型范围的数字,它将被解释为浮点数。此外,导致数字超出整数类型范围的操作将改为返回浮点数。

float 的精度约为 14 位有效数字,这就是您看到零的原因。

不幸的是,Windows 上的 PHP 不支持 64 位整数,根据this answer

在 windows x86_64 上,PHP_INT_MAX 是 2147483647。这是因为在底层 c 代码中,long 是 32 位。

但是,x86_64 上的 linux 使用 64 位长,因此 PHP_INT_MAX 将是 9223372036854775807。

【讨论】:

  • 谢谢,解决这个问题的方法是什么?这些数字代表我的 MySQL 数据库中的唯一 ID。
  • 将它们存储为字符串,如果您不需要像我想的那样计算它们。
  • 感谢所有 cmets。当我通过 bootcamp 运行 Windows 时,我最终设置了 XAMPP 并在 osx 上运行我的开发。可惜osx支持64位整数,太开心了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2021-04-06
相关资源
最近更新 更多