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écimals, s'il y a suffisamment de mémoire,
représentés sous la forme d'une chaîne de caractères.
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 nombre décimal à une fonction BCMath qui attend une chaîne de caractères comme opérande peut ne pas avoir l'effet désiré en raison de la façon dont PHP convertit les valeurs nombre décimal en chaîne de caractères, à savoir que la chaîne de caractères peut être en notation exponentielle (ce qui n'est pas pris en charge par BCMath), et que, antérieur à 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'
?>