Les nombres décimaux, (aussi connus comme nombres à virgule flottante, "floats", "doubles", ou "real numbers") peuvent être spécifiés en utilisant les syntaxes suivantes :
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
Formellement :
LNUM [0-9]+ DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*) EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
La taille d'un nombre décimal est dépendant de la plate-forme, cependant, un nombre maximal de ~1.8e308 avec une précision sur 14 chiffres est une valeur commune (format 64 bits IEEE).
Les nombres décimaux ont une précision limitée. Même s'ils dépendent du système, PHP utilise le format de précision des décimaux IEEE 754, qui donnera une erreur maximale relative de l'ordre de 1.11e-16 (dûe aux arrondis). Les opérations arithmétiques non-élémentaires peuvent donner des erreurs plus importantes et bien sûr les erreurs doivent être prises en compte lorsque plusieurs opérations sont liées.
Aussi, les nombres rationnels exactement représentables sous forme de nombre à virgule flottante en base 10, comme 0.1 ou 0.7, n'ont pas de représentation exacte comme nombres à virgule flottante en base 2, utilisée en interne, et ce quelle que soit la taille de la mantisse. De ce fait, ils ne peuvent être convertis sans une petite perte de précision. Ceci peut mener à des résultats confus: par exemple, floor((0.1+0.7)*10) retournera normalement 7 au lieu de 8 attendu, car la représentation interne sera quelque chose comme 7.9999999999999991118....
Ainsi, ne faites jamais confiance aux derniers chiffres d'un nombre décimal, mais aussi, ne comparez pas l'égalité de 2 nombres décimaux directement. Si vous avez besoin d'une haute précision, les fonctions mathématiques de précision et les fonctions gmp sont disponibles.
Pour une explication "simple", reportez-vous au » guide relatif aux nombres à virgule flottante.
Pour plus d'informations sur la conversion de chaînes en nombres décimaux, voir la section sur la conversion de chaînes en nombres décimaux. Pour les valeurs d'autres types, la conversion est effectuée en convertissant tout d'abord la valeur en un entier, puis, en nombre décimal. Voir la section sur la conversion en entier pour plus d'informations. Une notice est émise si un objet est converti en nombre décimal.
Comme dit dans la note ci-dessus, le test d'égalité des valeurs de nombres décimaux est problématique, en raison de la façon dont ils sont représentés en interne. Cependant, il existe des façons de réaliser cette comparaison.
Pour tester l'égalité de valeurs de nombres décimaux, une borne supérieure de l'erreur relative à l'arrondi est utilisée. Cette valeur est connue comme étant l'epsilon de la machine, ou le unit roundoff, et est la différence la plus petite acceptable dans les calculs.
$a et $b sont égaux sur 5 nombres après la virgule.
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
Quelques opérations numériques peuvent donner comme résultat une valeur
représentée par la constante NAN
. Ce résultat représente
une valeur indéfinie ou non représentable lors de calculs avec des nombres
à virgule flottante. Toute comparaison, même stricte de cette valeur avec
une autre valeur, y compris cette constante elle-même, donnera une valeur
de FALSE
.
En raison du fait que NAN
représente tout nombre de valeur
différente, NAN
ne doit pas être comparé à d'autres valeurs,
y compris cette constante elle-même, et à la place, elle doit être vérifiée
en utilisant la fonction is_nan().