2011-12-27 30 views
11

Estoy tratando esto, pero soy incapaz de almacenar gran valorlong int en PHP

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

Cómo obtener un valor deseado?

Respuesta

15

Desde el manual:

El tamaño de un entero es dependiente de la plataforma, aunque un valor máximo de aproximadamente dos mil millones es el valor habitual (es decir, 32 bits firmados). Las plataformas de 64 bits generalmente tienen un valor máximo de aproximadamente 9E18. PHP no admite enteros sin signo. El tamaño entero se puede determinar usando la constante PHP_INT_SIZE, y el valor máximo usando la constante PHP_INT_MAX desde PHP 4.4.0 y PHP 5.0.5.

...

Si PHP se encuentra con un número más allá de los límites del tipo entero, será interpretado como un flotador en su lugar. Además, una operación que da como resultado un número más allá de los límites del tipo entero devolverá una flotación en su lugar.

BC Math y GMP son el (único?) Forma de manipular esta limitación.

1

Si desea generar el número y manipularlo como un tipo nativo, no puede hacerlo con la mayoría de las instalaciones PHP (tiene 32 o 64 bit int sy nada más), como ya han dicho las otras respuestas. Sin embargo, si sólo están generando un número y desea pasar alrededor de un posible truco es simplemente concatenar cadenas:

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

en una plataforma en la que PHP usa un entero de 32 bits, esto le permite obtener un casi entero aleatorio (como una cadena) que es mayor que 32 bits (> 10 lugares decimales). Por supuesto, hay un sesgo en esta construcción, lo que significa que no cubrirá todos los números con la misma probabilidad. Los límites de las llamadas rand() obedecen a las reglas decimales normales por lo que es fácil ajustar el límite superior del número que desea.

Si todo lo que hace es almacenar/transmitir/mostrar este valor, la cadena estará bien. Igualdad y pruebas mayores/menores también funcionarán. Simplemente no hagas ninguna matemática con eso.

Cuestiones relacionadas