Pour les calculs mathématiques d'une grande précision, PHP fournit
BCMath, qui supporte n'importe quelle précision et
n'importe quelle taille de nombres jusqu'à 2147483647 (ou
0x7FFFFFFF) chiffres décimaux, s'il y a suffisamment de mémoire,
représentés sous la forme d'une string.
Les nombres BCMath valides (c.-à-d. bien formés) sont des chaînes qui
correspondent à l'expression régulière
/^[+-]?[0-9]*(\.[0-9]*)?$/.
Le passage de valeurs de type float à une fonction BCMath qui attend une string comme opérande peut ne pas avoir l'effet désiré en raison de la façon dont PHP convertit les valeurs float en string, à savoir que la string peut être en notation exponentielle (ce qui n'est pas supporté par BCMath), et que, antérieurement à PHP 8.0.0, le séparateur décimal dépend de la locale (tandis que BCMath attend toujours un point décimal).
<?php
$num1 = 0; // (string) 0 => '0'
$num2 = -0.000005; // (string) -0.000005 => '-5.05E-6'
echo bcadd($num1, $num2, 6); // => '0.000000'
setlocale(LC_NUMERIC, 'de_DE'); // utilise une virgule décimale
$num2 = 1.2; // (string) 1.2 => '1,2'
echo bcsub($num1, $num2, 1); // => '0.0'
?>