Convertir une chaîne contenant un nombre en notation scientifique à un double en PHP
-
14-10-2019 - |
Question
J'ai besoin d'aide pour convertir une chaîne qui contient un nombre en notation scientifique à un double.
chaînes Exemple: "1.8281e-009" "2.3562e-007" "0.911348"
Je pensais à tout rompre le numéro dans le numéro sur la gauche et l'exposant et que juste faire le calcul pour générer le nombre; mais est-il une meilleure / moyen standard pour le faire?
La solution
PHP est sans type typé dynamiquement, ce qui signifie qu'il doit analyser les valeurs pour déterminer leurs types (les versions récentes de PHP ont déclarations de type ).
Dans votre cas, vous pouvez simplement effectuer une opération numérique pour forcer PHP à prendre en compte les valeurs que le nombre (et il comprend la notation scientifique x.yE-z
).
Essayez par exemple
foreach (array("1.8281e-009","2.3562e-007","0.911348") as $a)
{
echo "String $a: Number: " . ($a + 1) . "\n";
}
juste ajouter 1 (vous pouvez également soustraire zéro) définirons les chaînes deviennent des nombres, avec la bonne quantité de décimales.
Résultat:
String 1.8281e-009: Number: 1.0000000018281
String 2.3562e-007: Number: 1.00000023562
String 0.911348: Number: 1.911348
Vous pourriez aussi jeter le résultat en utilisant (float)
$real = (float) "3.141592e-007";
Autres conseils
$f = (float) "1.8281e-009";
var_dump($f); // float(1.8281E-9)
$float = sprintf('%f', $scientific_notation);
$integer = sprintf('%d', $scientific_notation);
if ($float == $integer)
{
// this is a whole number, so remove all decimals
$output = $integer;
}
else
{
// remove trailing zeroes from the decimal portion
$output = rtrim($float,'0');
$output = rtrim($output,'.');
}
J'ai trouvé un poste qui number_format utilisé pour convertir la valeur à partir d'un numéro de notation scientifique flottante à un certain nombre de notation non-scientifique:
http: //jetlogs.org/2008/02/05/php-problems-with-big-integers-and-scientific-notation/
Note de l'éditeur: Lien est pourri
Exemple de la publication:
$big_integer = 1202400000;
$formatted_int = number_format($big_integer, 0, '.', '');
echo $formatted_int; //outputs 1202400000 as expected
HTH
Utiliser les fonctions number_format()
et rtrim()
ensemble. Par exemple,
//eg $sciNotation = 2.3649E-8
$number = number_format($sciNotation, 10); //Use $dec_point large enough
echo rtrim($number, '0'); //Remove trailing zeros
I créé une fonction, avec plus de fonctions (jeu de mots n'a pas pour but)
function decimalNotation($num){
$parts = explode('E', $num);
if(count($parts) != 2){
return $num;
}
$exp = abs(end($parts)) + 3;
$decimal = number_format($num, $exp);
$decimal = rtrim($decimal, '0');
return rtrim($decimal, '.');
}
function decimal_notation($float) {
$parts = explode('E', $float);
if(count($parts) === 2){
$exp = abs(end($parts)) + strlen($parts[0]);
$decimal = number_format($float, $exp);
return rtrim($decimal, '.0');
}
else{
return $float;
}
}
travail avec ,000077240388