Использование long int в PHP - PullRequest
12 голосов
/ 27 декабря 2011

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

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

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

Ответы [ 4 ]

18 голосов
/ 27 декабря 2011

Из руководства :

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

...

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

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

4 голосов
/ 27 декабря 2011

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

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

2 голосов
/ 27 декабря 2011

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

1 голос
/ 08 сентября 2015

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

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

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

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

...