2012-03-08 20 views
5

Szukałem już od pewnego czasu, ale to, co mogę znaleźć, nie jest tym, czego szukam. Muszę przekonwertować wartość całkowitą, która może być bardzo duża, na ciąg znaków. Brzmi łatwo: "$var"? Nie, ponieważ może to prowadzić do reprezentacji liczby.Konwertuj dużą liczbę całkowitą na pełną wartość w 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 

Jak mogę sprawić, że wyjście będzie 10000000000000000000000000 zamiast?

+3

Należy pamiętać, że „bardzo ogromna liczba całkowita” nie jest reprezentowane w komputerze jako liczba całkowita, gdyż przekracza zarówno 32-bitowe i 64-bitowe granic. – thetaiko

+1

$ var = '10000000000000000000000000'; –

+0

Nie można tego zrobić z natywną wartością typu int. Musi być zapisany jako ciąg. Jeśli wykonujesz operacje matematyczne na tym numerze, będziesz musiał użyć biblioteki [bcmath] (http://php.net/bcmath). –

Odpowiedz

8

To nie jest przechowywana jako liczba całkowita przez PHP, ale pływaka, dlatego skończyć z 1,0E + 25 zamiast 10000000000000000000000000.

To nie jest niestety możliwe użycie jako wartość całkowitą w PHP , ponieważ PHP nie może zapisać liczby całkowitej tego rozmiaru. Jeśli pochodzi z bazy danych, będzie to ciąg znaków i możesz zrobić to, co chcesz. Jeśli przechowujesz go w innym miejscu, przechowuj go jako ciąg.

Alternatywą jest przechowywanie go w trybie zmiennoprzecinkowym i uwzględnianie go przez cały czas, ale wymaga to dodatkowych konwersji i obsługi w niektórych miejscach.

Zasugerowano także użycie GNU Multiple Precision, ale nie jest to domyślnie włączone w PHP.

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

Właśnie miałem zasugerować GMP. Nie używaj pływaka - dokładność na tak dużej liczbie nie jest niezawodna. – AndrewR

2

UPDATE: znaleziono następnego postu:

// 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 

Zastosowanie printf lub sprintf.

+0

Przesyłam go omyłkowo przed dodaniem drugiej części odpowiedzi –

+0

Płaty nie są niezawodne w tym rozmiarze. 'echo sprintf ("% 0.0f ", 10000000000000000000000000);' na moim systemie wypisuje '10000000000000000905969664'. – AndrewR

2

Liczbę całkowitą chcesz wyrazić:

$var = 10000000000000000000000000; 

nie jest dostępna w systemie. To jest zbyt duże i dlatego PHP konwertuje je do pływaka, który spowoduje zmianę numeru (przykład układ 32-bitowy):

 10000000000000000905969664 

wspólne granice są:

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 

Zmiana wartości nazywa zmiennoprzecinkową precyzja, PHP manual about integers powie Ci o limicie całkowitym i the floats page about floating point precision (patrz duże czerwone ostrzeżenie). W zależności od tego, jaki system posiadasz, możesz skompilować PHP z zakresami wymaganymi przez twoją aplikację lub musisz użyć innego typu danych, na przykład z the gmp library, który jest w stanie wybierać ciągi znaków jako liczby całkowite i obsługiwać je.

Poniższy przykład pokazuje tylko moc, ale można zrobić mnożenia itp .:

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

nadzieję, że to pomocne.

Powiązane problemy