PHP: ¿Cómo convertir bigint de int a string?

Quiero ser capaz de convertir grandes ints en sus derivados de cadena completos.

Por ejemplo.

$bigint = 9999999999999999999; $bigint_string = (string) $bigint; var_dump($bigint_string); 

salidas

 string(7) "1.0e+19" 

Pero yo necesito

 string(19) "9999999999999999999" 

Por favor, no me diga que originalmente debería establecer el valor de $ bigint como una cadena. Esa no es una opción. Realmente estoy atascado y no sé si es posible?

En realidad, debes asegurarte de escribir lo que quieres decir:

 $bigint = 9999999999999999999; 

No es un entero de PHP sino flotante:

 float(1.0E+19) 

Si hubieras hecho

 $bigint = (int) 9999999999999999999; 

De hecho, habría establecido un número entero, pero no sería el número que podría haber esperado:

 int(-8446744073709551616) 

No hay ningún problema en convertirlo en una cuerda como habrás adivinado. Así que tenga cuidado cuando escriba números en el código para que realmente escriba lo que quiere decir.

Ver esta línea de nuevo:

 $bigint = 9999999999999999999; 

trata de entender lo que has escrito realmente No es un entero en absoluto porque PHP lo convertirá en un flotador. Vea el Ejemplo # 4 Desbordamiento de enteros en un sistema de 64 bits en la página de manual entero .

Si necesita una mayor precisión, obtenga la Precisión Múltiple GNU , podría tener lo que está buscando. Sin embargo, esto no cambiará la forma de escribir números en PHP:

 $bigint = gmp_init("9999999999999999999"); $bigint_string = gmp_strval($bigint); var_dump($bigint, $bigint_string); 

Salida:

 resource(4) of type (GMP integer) string(19) "9999999999999999999" 

Utilice strval() .

 echo strval($bigint); // Will output "99999999999999999" 

EDITAR: Después de una investigación un poco mejor (> 5000ms), veo que es imposible hacer un eco de los números con esa precisión, porque PHP no puede guardar un número entero de ese tamaño (depende del sistema de bits del sistema operativo, 32/64). Parece que no es posible hacerlo sin perder precisión.

Use printf() , está hecho para eso:

 echo printf("%d", $bigint); 

¡Simplemente almacene el valor como una cadena y despliegue …!

  $bigint = '9999999999999999999'; var_dump($bigint); 

Salida:

 string(19) "9999999999999999999"