Para matemática de precisão arbitrária, o PHP oferece BCMath, que
suporta números de qualquer tamanho e com precisão de até 2147483647
(ou 0x7FFFFFFF
) dígitos decimais,
até a memória disponível, representadas como strings.
Numéros válido (ou bem formados) são strings que concordam com a expressão regular
/^[+-]?[0-9]*(\.[0-9]*)?$/
.
Passar valores de tipo float para uma função BCMatch, que espera um operando string pode não funcionar como esperado dado que o PHP converte valores float para string, especificamente que a string convertida pode estar numa notação exponencial (que não é suportado no BCMath), e dado que, anteriormente ao PHP 8.0.0, o separador decimal depende da locale configurada (enquanto BCMath sempre trabalho com ponto).
<?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'); // uses a decimal comma
$num2 = 1.2; // (string) 1.2 => '1,2'
echo bcsub($num1, $num2, 1); // => '0.0'
?>