2012-03-08 17 views
5

Ho cercato per un po 'di tempo, ma quello che riesco a trovare non è quello che cerco. Devo convertire un valore intero, che può essere molto grande, in una stringa. Sembra facile: "$var"? No, perché questo può portare alla rappresentazione del numero E+.Convertire un intero grande in una stringa intera in PHP

<?php 

$var = 10000000000000000000000000; 
echo $var."\n"; 
echo "'$var'\n"; 
echo (string) $var."\n"; 
echo strval($var); 

?> 

1.0E+25 
'1.0E+25' 
1.0E+25 
1.0E+25 

come posso fare l'output sia 10000000000000000000000000 invece?

+3

Si prega di notare che il vostro "molto grande integer" non è rappresentato nel computer come un intero, come si supera entrambi i limiti a 32bit e 64bit. – thetaiko

+1

$ var = '10000000000000000000000000'; –

+0

Non è possibile farlo con un valore int nativo. Dovrà essere memorizzato come una stringa. Se stai facendo operazioni matematiche su questo numero, dovrai usare la libreria [bcmath] (http://php.net/bcmath). –

risposta

8

Questo non è memorizzato come numero intero da PHP, ma un galleggiante, questo è il motivo per cui si finisce con 1.0E + 25 invece di 10000000000000000000000000.

Non è purtroppo possibile utilizzarlo come un valore intero in PHP , poiché PHP non può salvare un numero intero di quella dimensione. Se proviene dal database, sarà una stringa e puoi farne tutto ciò che vuoi. Se lo memorizzi altrove, memorizzalo come una stringa.

L'alternativa è quella di conservarlo come un galleggiante e tenerne conto in ogni momento, anche se questo richiede ulteriori conversioni di spedizione in posti.

E 'stato anche suggerito di utilizzare GNU Multiple Precision, ma che non è abilitato PHP per impostazione predefinita.

$int=gmp_init("10000000000000000000000000"); 
$string=gmp_strval($int); 
echo $string; 
+0

Stavo per suggerire GMP. Non utilizzare un galleggiante: la precisione in quel grande numero non è affidabile. – AndrewR

2

UPDATE: Trovato il prossimo post:

// strval() will lose digits around pow(2,45); 
echo pow(2,50); // 1.1258999068426E+015 
echo (string)pow(2,50); // 1.1258999068426E+015 
echo strval(pow(2,50)); // 1.1258999068426E+015 

// full conversion 
printf('%0.0f',pow(2,50)); // 112589906846624 
echo sprintf('%0.0f',pow(2,50)); // 112589906846624 

Usa printf o sprintf.

+0

Lo invio per errore prima di aggiungere la seconda parte della risposta –

+0

I float non sono affidabili con queste dimensioni. 'echo sprintf ("% 0.0f ", 10000000000000000000000000);' sulle uscite di sistema '10000000000000000905969664'. – AndrewR

2

Il numero intero che ti piace di esprimere:

$var = 10000000000000000000000000; 

non è disponibile sul sistema. È troppo grande e quindi PHP converte in un galleggiante che cambierà il numero (esempio di sistema 32 bit):

 10000000000000000905969664 

limiti comuni sono:

yours : 10 000 000 000 000 000 000 000 000 
32 bit:      2 147 483 648 
64 bit:   9 223 372 036 854 775 808 

La variazione del valore è chiamato virgola mobile precisione, il numero PHP manual about integers indicherà il limite di numero intero e the floats page about floating point precision (vedere il grande avviso rosso). A seconda del sistema in uso, puoi compilare PHP con gli intervalli richiesti dall'applicazione o devi utilizzare un altro tipo di dati, ad esempio con the gmp library che è in grado di selezionare stringhe come numeri interi e gestirle.

L'esempio seguente mostra appena uscita, ma si può fare moltiplicazioni ecc .:

$r = gmp_init('10000000000000000000000000'); 
echo gmp_strval($r); 

Spero che questo è utile.

Problemi correlati