我有一个我正在使用的简单功能,但由于某种原因,该数字无法像在计算器中那样正确计算。我认为它与数字太大有关,或与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
答案 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位环境中也会发生这种问题。