64-битные числа PHP? - PullRequest
       1

64-битные числа PHP?

1 голос
/ 11 сентября 2010

У меня есть простая функция, которую я использую, но по какой-то причине число вычисляется неправильно, как в калькуляторе.Я думаю, что это связано с тем, что числа слишком велики, или с 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

1 Ответ

1 голос
/ 11 сентября 2010

Отсутствие global $steamBase было проблемой, как уже упоминалось в комментарии.(Совет: включите E_NOTICE во время разработки.) Однако я хотел бы ответить на ваш вопрос:

Я думаю, что это связано с тем, что числа слишком велики или что-то нужно сделатьс 64 бит.Можно ли как-нибудь преобразовать их, чтобы они работали правильно?

Целые числа PHP подписаны и зависят от платформы.Использование 64-битных чисел не будет работать, если вы работаете на 32-битном хосте.

Так что ваша проблема верна.Но даже в 64-битной системе:

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

--> float(9.2233720368548E+18)

Обратите внимание, что функции PHP Math в PHP работают со строками, а не целыми числами.Таким образом, вы должны хранить ваши большие числа в виде строк.

Это позволит обойти потенциальную проблему преобразования целых чисел в числа с плавающей точкой, которая может возникнуть даже в вашей 64-битной среде, если вы используете большие целые числа без знака.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...