PHP 64位数?

时间:2010-09-11 02:11:58

标签: php math

我有一个我正在使用的简单功能,但由于某种原因,该数字无法像在计算器中那样正确计算。我认为它与数字太大有关,或与64位有关。有什么方法可以转换它们以便它们能够正常工作吗?

$sSteamComID = 76561197990369545;
$steamBase = 76561197960265728;

function convertToSteamID($sSteamComID) {
    $sServer = bcmod($sSteamComID, '2') == '0' ? '0' : '1';
 $sCommID = bcsub($sSteamComID, $sServer);
 $sCommID = bcsub($sCommID, $steamBase);
 $sAuth = bcdiv($sCommID, '2');

 echo "$sServer:$sAuth";
}

convertToSteamID($sSteamComID);

当应该打印时,此功能在服务器上输出0:15051912:15051908

1 个答案:

答案 0 :(得分:1)

缺失的global $steamBase是问题,正如评论中已经提到的那样。 (提示:在开发过程中启用E_NOTICE。)但是,我想解决您的问题:

  

我认为这与某些事情有关   数字太大,或者   与64位有关。在那儿   我能以任何方式转换它们   他们会正常工作吗?

PHP整数是签名和平台相关的。如果您使用的是32位主机,则使用64位数字将无效。

所以你的关注是有效的。但即使是在64位系统上:

$x = 9223372036854775808; // highest bit (64th) set
var_dump($x);

--> float(9.2233720368548E+18)

请注意,PHP的BC Math例程对字符串而不是整数进行操作。因此,您应该将大数字存储为字符串。

这将解决整数转换为浮点数的潜在问题,如果使用大的无符号整数,即使在64位环境中也会发生这种问题。