Maison  >  Article  >  développement back-end  >  Analyse du type de données PHP à virgule flottante (Float)

Analyse du type de données PHP à virgule flottante (Float)

怪我咯
怪我咯original
2017-04-05 10:42:032459parcourir

Float (également appelé floatfloat, double ou réel) peut être défini avec l'une des syntaxes suivantes :

<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>

Représentation des nombres à virgule flottante :

LNUM [0-9]+
DNUM ([0-9]*[.]{LNUM }) ({LNUM }[.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})

Le mot La longueur des nombres à virgule flottante dépend de la plate-forme, bien que la valeur maximale soit généralement de 1,8e308 avec une précision de 14 chiffres décimaux (format IEEE 64 bits).

Attention

La précision des nombres à virgule flottante

La précision des nombres à virgule flottante est limitée. Bien que cela dépende du système, PHP utilise généralement le double format IEEE 754, donc l'erreur relative maximale due à l'arrondi est de 1.11e-16. Les opérations mathématiques non fondamentales peuvent donner lieu à des erreurs plus importantes, et la propagation des erreurs lors de l'exécution d'opérations composées doit être prise en compte.

De plus, les nombres rationnels tels que 0,1 ou 0,7 qui peuvent être représentés avec précision en décimal, quel que soit le nombre de mantisses, ne peuvent pas être représentés avec précision par le binaire utilisé en interne et ne peuvent donc pas être convertis en binaire sans perdre un peu de précision. Cela peut conduire à des résultats confus : par exemple, floor((0.1+0.7)*10) renverra généralement 7 au lieu du 8 attendu, car la représentation interne du résultat est en fait quelque chose comme 7.999999999999999991118... .

Ne croyez donc jamais qu'un résultat de nombre à virgule flottante est précis jusqu'au dernier chiffre, et ne comparez jamais deux nombres à virgule flottante pour voir s'ils sont égaux. Si vous avez vraiment besoin d'une plus grande précision, vous devez utiliser la fonction mathématique de précision arbitraire ou la fonction gmp.

Voir la page Web du Guide de virgule flottante pour une explication simple.

Convertir en nombre à virgule flottante

Si vous souhaitez des informations sur quand et comment convertir une Chaîne en nombre à virgule flottante, voir Conversion d'une chaîne en festival de nombres . Pour les autres types de valeurs, la situation est similaire à la conversion de la valeur en entier puis en virgule flottante. Voir la section « Conversion en nombre entier » pour plus d'informations. Depuis PHP 5, si vous tentez de convertir un objet en un nombre à virgule flottante, un message d'erreur E_NOTICE est émis.

Comparez les nombres à virgule flottante

Comme l'indique le message d'avertissement ci-dessus, pour des raisons d'expression interne, il y a un problème lors de la comparaison de deux nombres à virgule flottante pour l'égalité. Cependant, il existe des moyens détournés pour comparer les valeurs à virgule flottante.

Pour tester l'égalité des nombres à virgule flottante, utilisez une valeur d'erreur minimale qui n'est qu'un point supérieure à cette valeur. Cette valeur est également appelée valeur minimale de la machine (epsilon) ou la plus petite unité est un entier , qui est la plus petite valeur de différence acceptable dans les calculs.

$a et $b sont égaux à cinq décimales de précision.

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
   echo "true";
}
?>
NaN

Certaines opérations mathématiques produisent un résultat représenté par la

constante NAN. Ce résultat représente une valeur indéfinie ou non représentable en arithmétique à virgule flottante. Le résultat de toute comparaison vague ou stricte de cette valeur avec toute autre valeur est FAUX.

Étant donné que NAN représente une valeur différente, NAN ne doit pas être comparé à d'autres valeurs, y compris elle-même, et doit être vérifié à l'aide de is_nan().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn