Использование long int в PHP

Я пытаюсь это сделать, но не могу сохранить большое значение

$var = rand(100000000000000,999999999999999);
echo $var; // prints a 9 digit value(largest possible)

Как получить желаемое значение ?

4 ответов


PHP ints обычно 32 бита. Другие пакеты обеспечивают более высокоточные ints:http://php.net/manual/en/language.types.integer.php


с руководство:

размер integer зависит от платформы, хотя максимальное значение около двух миллиардов привычное значение (это 32-битное знаковое). 64-битные платформы обычно имеют максимальное значение около 9E18. PHP не поддерживает беззнаковые целые. Целочисленный размер можно определить с помощью константы PHP_INT_SIZE, а максимальное значение с помощью константы PHP_INT_MAX начиная с PHP 4.4.0 и PHP 5.0.5.

...

Если PHP встречает число за пределами целочисленного типа, оно будет интерпретироваться как float. Кроме того, операция, которая приводит к числу за пределами целочисленного типа, возвращает float.

BC Math и GMP это (только?) способ манипулировать этим ограничением.


Если вам нужно работать с очень большими числами, я нашел успех с bc Math. Вот ссылка на все, что вам нужно знать:

http://php.net/manual/en/book.bc.php


Если вы хотите создать число и манипулировать как собственный тип, вы не можете с большинством установок PHP (либо у вас есть 32 или 64 бит ints и ничего больше), как уже говорилось в других ответах. Однако, если вы просто генерируете число и хотите передать его, возможный трюк - просто объединить строки:

$var = rand(0,PHP_INT_MAX).str_pad(rand(0, 999999999), 9, 0, STR_PAD_LEFT);
echo $var;

на платформе, в которой PHP использует 32-битное целое число, это позволяет получить почти случайное целое число (в виде строки), которое больше 32 бит ( > 10 знаков после запятой). Конечно, в этой конструкции есть смещение, что означает, что вы не будете покрывать все числа с одинаковой вероятностью. Пределы rand() вызовы подчиняются нормальным десятичным правилам, поэтому его просто настроить верхнюю границу числа, которое вы хотите.

Если все, что вы делаете, это сохранение/передача/отображение этого значения, строка будет в порядке. Равенство и больше / меньше тестов также будут работать. Просто не считай с этим.