## Nombres à virgule flottante

Les nombres à virgule flottante (aussi connus comme `"floats"`, `"doubles"`, ou `"nombres réels"`) peuvent être spécifiés en utilisant les syntaxes suivantes :

    <?php
    $a = 1.234;
    $b = 1.2e3;
    $c = 7E-10;
    $d = 1_234.567; // à partir de PHP 7.4.0
    ?>

Formellement à partir de PHP 7.4.0 (auparavant, les underscores n'étaient pas autorisés) :

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

La taille d'un nombre décimal est dépendante de la plate-forme, cependant, un nombre maximal d'environ 1.8e308 avec une précision sur 14 chiffres est une valeur commune (format 64 bits IEEE).

Avertissement

# Précision des nombres flottants

Les nombres flottants ont une précision limitée. Même s'ils dépendent du système, PHP utilise le format de double précision IEEE 754, qui donnera une erreur maximale relative de l'ordre de 1.11e-16 (due 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, il ne faut jamais faire confiance aux derniers chiffres d'un nombre flottant, et il ne faut pas non plus comparer l'égalité de 2 nombres flottants directement. Si une plus grande précision est nécessaire, les fonctions mathématiques de précision arbitraire et les fonctions gmp sont disponibles.

Pour une explication "simple", voir le » guide relatif aux nombres à virgule flottante qui est aussi intitulé "Why don't my numbers add up?"

### Convertir en un nombre flottant

#### Depuis des chaînes de caractères

Si une chaîne est numérique ou numérique de tête alors elle sera transformée en sa valeur flottante correspondante, sinon elle sera convertie en zéro (`0`).

#### Depuis d'autres types

Pour les valeurs d'autres types, la conversion est effectuée en convertissant la valeur d'abord en int puis en float. Voir conversion en entier pour plus d'informations.

> Note:

> Comme certains types ont un comportement indéfini lors de la conversion en int, ceci est aussi le cas lors de la conversion en float.

### Comparaison de nombres flottants

Comme dit dans la note ci-dessus, le test d'égalité des valeurs de nombres flottants 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 flottants, 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.

Exemple #1 Comparaison de nombres flottants

    <?php
    $a = 1.23456789;
    $b = 1.23456780;
    $epsilon = 0.00001;

    if (abs($a - $b) < $epsilon) {
        echo "true";
    }
    ?>

### NaN

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, sauf si elle est égale à `true`, donnera une valeur de `false`.

En raison du fait que `NAN` représente tout nombre de valeurs différentes, `NAN` ne devrait pas être comparé à d'autres valeurs, y compris cette constante elle-même, et à la place, devrait être vérifié en utilisant la fonction is_nan().

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open