web-dev-qa-db-fra.com

Utilisation de long int in PHP

J'essaie ceci, mais je ne peux pas stocker de grande valeur

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

Comment obtenir une valeur souhaitée?

12
Prashant Singh

Le contenu de PHP est généralement de 32 bits. D'autres paquets fournissent des ints de plus haute précision: http://php.net/manual/fr/language.types.integer.php

2
Ned Batchelder

De la manuel :

La taille d'un entier dépend de la plate-forme, bien qu'une valeur maximale d'environ deux milliards soit la valeur habituelle (c'est-à-dire 32 bits signés). Les plates-formes 64 bits ont généralement une valeur maximale d'environ 9E18. PHP ne supporte pas les entiers non signés. La taille entière peut être déterminée à l'aide de la constante PHP_INT_SIZE et la valeur maximale à l'aide de la constante PHP_INT_MAX depuis PHP 4.4.0 et PHP 5.0.5.

...

Si PHP rencontre un nombre au-delà des limites du type entier, il sera interprété comme un flottant. En outre, une opération qui aboutit à un nombre au-delà des limites du type entier renvoie un float.

BC Math et GMP sont le (seul?) Moyen de manipuler cette limitation.

17
DaveRandom

Si vous avez besoin de travailler avec un très grand nombre, j'ai trouvé le succès avec BC Math. Voici un lien vers tout ce que vous devez savoir:

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

4
TimWickstrom.com

Si vous voulez générer le nombre et le manipuler en tant que type natif, vous ne pouvez pas utiliser la plupart des installations PHP (vous avez soit ints 32 ou 64 bits et rien d'autre), comme les autres réponses l'ont déjà indiqué. Toutefois, si vous générez simplement un nombre et souhaitez le transmettre, une astuce consiste à concaténer des chaînes:

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

Sur une plate-forme dans laquelle PHP utilise un entier de 32 bits, cela vous permet d'obtenir un entier presque aléatoire (sous forme de chaîne) supérieur à 32 bits (> 10 décimales). Bien sûr, il y a un biais dans cette construction, ce qui signifie que vous ne couvrirez pas tous les nombres avec la même probabilité. Les limites des appels Rand() obéissent aux règles décimales normales. Il est donc simple d’ajuster la limite supérieure du nombre souhaité. 

Si vous ne faites que stocker/transmettre/afficher cette valeur, la chaîne suffira. L'égalité et supérieure/inférieure aux tests fonctionneront également. Ne fais pas de math avec ça.

1
jeteon