Para matemáticas de precisión arbitraria, PHP ofrece BCMath,
que admite números de cualquier tamaño y precisión de hasta 2147483647
(o 0x7FFFFFFF
) dígitos decimales,
si hay suficiente memoria, representados como cadenas.
Números válidos (también conocidos como bien formados) en BCMath son cadenas que coinciden con la expresión regular
/^[+-]?[0-9]*(\.[0-9]*)?$/
.
Pasar valores de tipo float a una función de BCMath que espera un string como operando puede no tener el efecto deseado debido a la forma en que PHP convierte valores de tipo float a string, es decir, que el string puede estar en notación exponencial (que no es compatible con BCMath), y que, antes de PHP 8.0.0, el separador decimal dependía de la configuración regional (mientras que BCMath siempre espera un punto decimal).
<?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'); // Utiliza una coma decimal
$num2 = 1.2; // (string) 1.2 => '1,2'
echo bcsub($num1, $num2, 1); // => '0.0'
?>