2013-05-09 6 views
4

Le numéro est 13911392101301011 et indépendamment de l'utilisation sprintf ou number_format je reçois le même résultat étrange.Impression de grands nombres en PHP

sprintf('%017.0f', "13911392101301011"); // Result is 13911392101301012 
number_format(13911392101301011, 0, '', ''); // Result is 13911392101301012 

sprintf('%017.0f', "13911392101301013"); // Result is 13911392101301012 
number_format(13911392101301013, 0, '', ''); // Result is 13911392101301012 
+0

Idée aléatoire: Le nombre est-il interprété comme un «float» ou un «double» et arrondi à la valeur valide la plus proche d'un tel type de données? Remarqué qu'il est trop grand pour tenir dans un entier de 32 bits, il pourrait tenir dans un entier de 64 bits mais pas sûr si c'est le cas. – Patashu

+0

Je sais que c'est trop grand, Mais j'ai trouvé en utilisant 'sprintf' ou' number_format' devrait résoudre le problème. Malheureusement, ne fonctionne pas dans ce cas – Omid

+0

Intéressant que '13911392101301014' est imprimé correctement et' 13911392101301011' n'est pas, donc ce n'est pas un problème de gamme –

Répondre

-1

Votre appel number_format définit le. et, à blanc

string number_format (float $number , int $decimals = 0 , string $dec_point = '.' , string $thousands_sep = ',') 

essayer.

number_format(13911392101301011, 0, '.', ','); 
+0

Le résultat est '13,911,392,101,301,012' – Omid

+0

N'est-ce pas ce que vous essayez de faire? Oh, votre problème est le "arrondi" du dernier chiffre soit vers le haut ou vers le bas. Quelle version de PHP utilisez-vous? – Revent

+0

Mauvaise réponse. L'OP n'essaie pas de formater le nombre, mais d'imprimer sa valeur comme indiqué. – Antony

0

C'est faire le travail> !!

$num1 = "13911392101301011"; 
$r = mysql_query("Select @sum:=$num1"); 
$sumR = mysql_fetch_row($r); 
echo $sum = $sumR[0]; 
+0

Merci M. Obvious. '$ sumR [0]' est identique à '$ num1', qui est une chaîne. – Antony

+0

Je suppose que le point ici est de traiter le nombre comme un nombre pas comme une chaîne! – eldblz

+0

désolé j'étais juste en train d'essayer mais nous pouvons effectuer n'importe quel calcul sur cette utilisation. mysql_query ("Select @sum: = $ num1 + $ num2"); –

0

Vous pouvez faire facilement la façon suivante: -

ini_set("precision",25); // change 25 to whatever number you want or need 
$num = 13911392101301011; 
print $num; 
+1

Toujours le même: '13911392101301012' – Antony

+0

non, je l'ai testé it.it fonctionne et bien sûr BCMath est une bonne option. –

0

Puisque vous faites affaire avec un grand nombre ici, vous pouvez les garder sous forme de chaînes et effectuer une opération numérique sur les valeurs de chaîne en utilisant BCMath functions.

$val = "13911392101301011"; 

echo $val; // 13911392101301011 
echo bcadd($val, '4'); // 13911392101301015 
echo bcmul($val, '2'); // 27822784202602022 
0

Comme vous avez réellement le nombre en tant que chaîne, utilisez le modificateur %s:

sprintf('%s', "13911392101301011"); // 13911392101301011 

Notez que PHP utilise un entier signé en interne. La taille dépend de votre système.

système 32bit:

2^(32-1) = 2147483648 

système 64bit:

2^(64-1) = 9223372036854775808 

-1 parce que 1 bit est réservé pour le drapeau de signalisation.

0

La documentation indique que $ number est number_format is float, de sorte qu'il y a un transtypage explicite. Équivalent ressemblerait à ceci:

sprintf('%017.0f', (float) "13911392101301011"); 

flotteur est précise à environ 14 digits et votre numéro a 17 chiffres.