2010-09-11 118 views
1

我有一个简单的功能,我正在使用,但由于某种原因,数字计算不正确,因为它会在计算器中。我认为这与数字太大有关,或与64位有关。有什么方法可以将它们转换为正确的?PHP 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在服务器上时,它应该打印1:15051908

+0

不是一个深入的评估,但我不认为你需要引用你的数值。 – 2010-09-11 02:41:00

+0

谢谢你们。 Stereofrog似乎已经修复了它:) – Jake 2010-09-11 02:51:49

回答

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位环境中,如果使用大的无符号整数,这些问题也会发生。