2015-08-19 28 views
3

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

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

返回以下控制台:

0:24053826281538000 
1:24051529749103000 
2:111 

这究竟是为什么?

+0

你能在这里粘贴'echo PHP_INT_MAX'的结果吗? – marian0

+0

看起来像它们被转换为浮点数,但对于64位整数它们不是太大。 – Glorfindel

+0

我做了一个打印(PHP_INT_MAX)结果是2147483647 –

回答

2

这些数字太大而不适合(32位)整数。它们将被解释为浮点数,请参阅documentation

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

A float的精度约为14位有效数字,因此这就是为什么您会看到零。

不幸的是,PHP在Windows不支持64点比特的整数,根据this answer

在窗口x86_64的,PHP_INT_MAX为2147483647。这是因为在底层的C代码,长为32位。

然而,在x86_64 Linux使用一个64位长,所以PHP_INT_MAX将是9223372036854775807

+1

谢谢,那么围绕它的工作是什么?这些数字表示我的MySQL数据库中的唯一ID。 –

+2

将它们作为字符串存储,如果不需要用它们进行计算,就像我想的那样。 – syck

+0

谢谢你的所有意见。当我通过bootcamp运行Windows时,我最终设置了XAMPP并在osx上运行了我的开发。耻辱,但osx支持64位整数,太高兴了。 –

1

你可能32位计算机上运行脚本,其中max int是2147483647,所以整数溢出occurres。根据文档:

如果PHP遇到一个超出整数类型范围的数字,它将被解释为一个float而不是。此外,如果操作超出整数类型的范围,则返回 而不是float。

<?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找到。

+0

谢谢我正在运行64位Windows和64位WAMP服务器,应该发生这种情况吗? –

+0

谢谢阅读其他答案 –