2010-12-16 7 views
3

J'ai un nombre à virgule flottante en format exponentiel à savoir 4.1595246940817E-17 et je veux le convertir en nombre décimal comme 2,99, etc.Convertir nombre exponentiel en décimal en php

Toute aide sera appréciée.

format_number()sprintf() ne semblent pas fonctionner pour moi.

+0

Exponentielle ou décimal ne sont que des façons de montrer une forme lisible par l'homme du nombre. Je ne suis pas vraiment sûr de ce que vous voulez .. – ssice

+1

Je n'arrive pas à comprendre d'où vient 2,99 (vous pourriez nous dire ce que vous attendez vraiment), mais attendez-vous à __number_format (4.1595246940817E-17, 2) __ pour produire __4.15__? Si c'était le cas, vos calculs seraient de plusieurs ordres de grandeur (le résultat correct serait __0.00__). – GZipp

+0

Oui, je m'attends à 4.1595246940817E-17 pour produire 2.99. Voici ma situation. Allocation Taille: 65536 bytes = 65536/1024 = 64KB. Unités d'allocation: 49107. Taille totale = 49107 * 64 = 3142848KB = 3069.18MB = 2.99GB – Saqib

Répondre

3

Vous avez besoin d'une meilleure extension mathématique comme BC Math, GMP... pour gérer la précision plus précise.

Limitation de floating number & integer

+0

Oui, je m'attends à 4.1595246940817E-17 pour produire 2.99. Voici ma situation. Allocation Taille: 65536 bytes = 65536/1024 = 64KB. Unités d'allocation: 49107. Taille totale = 49107 * 64 = 3142848KB = 3069.18MB = 2.99GB – Saqib

+0

@ user544836 - est-ce un maths? Si oui, essayez l'extension mathématique, Si ** NON ** ... pas sûr de ce qui peut être fait – ajreal

+0

@Saqib-ic, vous devriez le faire à la place de "php -r" echo 49107 * 64/1024/1024; "' , préréglez le Gb au lieu de le laisser déborder ... – ajreal

1

Utilisation de la bibliothèque BC Math vous pouvez bcscale() les nombres à une décimale prédéterminée, qui définit le paramètre pour les calculs futurs qui nécessitent une précision arithmétique.

bcscale(3); 
echo bcdiv('105', '6.55957'); // 16.007 
1

Vous pouvez supprimer la virgule ($ x est votre numéro):

$strfloat = strtolower((string)($x)); 
$nodec = str_replace(".", "", $x); 

extrait ensuite la partie exponentielle.

list($num, $exp) = explode("e", $nodec); 
$exp = intval($exp); 

Ensuite, vous avez la virgule, et le nombre, donc vous pouvez formater:

if($exp < 0) return "0." . ("0" * -($exp + 1)) . $num; 
if($exp == 0) return (string)$x; 
if($exp > 0) return $num . ("0" * $exp); 

n'ajoute précision cependant, seulement des zéros supplémentaires.

0

Voici une solution en utilisant BC Math, comme le suggère ajreal et Russell Dias:

$au = 65536; 
$auk = bcdiv($au, 1024); 
$totalSize = bcdiv(bcmul(49107, $auk), bcpow(1024, 2), 2); 
echo $totalSize . "\n"; 

// echos 2.99 
Questions connexes