web-dev-qa-db-fra.com

Pourquoi PHP imprime-t-il mon numéro en notation scientifique, alors que je l'ai spécifié en .000021?

Dans PHP j'ai le code suivant:

<?PHP
  $var = .000021;
  echo $var;
?>

la sortie est 2.1E-5!

Pourquoi? il devrait imprimer .000021

36
ahmed

Utilisez number_format () pour obtenir ce que vous recherchez:

print number_format($var, 5);

Vérifiez également sprintf ()

51
acrosman

2.1E-5 est le même nombre que 0,000021. C'est ainsi qu'il imprime des nombres inférieurs à 0,001. Utilisez printf () si vous le souhaitez dans un format particulier.

Modifier Si vous n'êtes pas familier avec le 2.1E-5 syntaxe, vous devez savoir que c'est un raccourci pour 2.1 × 10-5. C'est ainsi que la plupart des langages de programmation représentent des nombres en notation scientifique.

25
Kip

En général, un nombre est un nombre, pas une chaîne, et cela signifie que tout langage de programmation traite un nombre comme un nombre. Ainsi, le nombre en lui-même n'implique aucun format spécifique (comme l'utilisation de .000021 au lieu de 2.1e-5). Ce n'est rien de différent que d'afficher un nombre avec des zéros en tête (comme 0.000021) ou en alignant les listes de nombres. C'est un problème général que vous trouverez dans n'importe quel langage de programmation: si vous voulez un format spécifique, vous devez le spécifier, en utilisant les fonctions de format de votre langage de programmation.

Sauf si vous spécifiez le nombre sous forme de chaîne et le convertissez en un nombre réel si nécessaire, bien sûr. Certaines langues peuvent le faire implicitement.

8
bluebrother

Utilisez number_format ou sprintf si vous voulez voir le nombre comme vous l'attendez.

echo sprintf('%f', $var);
echo number_format($var, 6);
8
Vex

Pour afficher un nombre jusqu'à 8 espaces décimaux, sans zéros supplémentaires à droite (comme le fait number_format, ce qui peut être gênant), utilisez ceci:

echo rtrim(rtrim(sprintf('%.8F', $var), '0'), ".");
6
Joey Rich

Les langages de programmation ont différentes méthodes pour stocker des nombres en mémoire. Ceci est déterminé par le type de numéro utilisé. Dans votre cas, vous avez un nombre à virgule flottante (une fraction) qui est trop grand pour être stocké comme un nombre à virgule fixe (les fractions sont stockées de cette manière en fonction de leur taille).

Il s'agit d'une fonctionnalité très importante, en particulier lorsque vous travaillez avec de très grands ou très petits nombres. Par exemple, la NASA ou spaceX utilise des méthodes de stockage spéciales pour ses calculs afin de s'assurer que les fusées qui rentrent en orbite terrestre atterrissent là où elles devraient.

En outre, différentes méthodes de stockage occupent différentes quantités de mémoire. Cependant, la solution fournie ci-dessus devrait fonctionner. N'oubliez pas que des erreurs d'arrondi peuvent survenir avec des nombres très grands ou très petits.

1
Student101

Les réponses précédentes ont répondu à la question OP, mais aucune n'a proposé le code pour le faire.
Utilisez cette fonction pour formater n'importe quel nombre au format E -.

function format_amount_with_no_e($amount) {
    $amount = (string)$amount; // cast the number in string
    $pos = stripos($amount, 'E-'); // get the E- position
    $there_is_e = $pos !== false; // E- is found

    if ($there_is_e) {
        $decimals = intval(substr($amount, $pos + 2, strlen($amount))); // extract the decimals
        $amount = number_format($amount, $decimals, '.', ','); // format the number without E-
    }

    return $amount;
}

Veuillez noter que la fonction renverra toujours une chaîne.

1
Binar Web