Введение
Для вычислений с произвольной точностью PHP предоставляет BCMath, который поддерживает числа любого размера и точности, вплоть до
2147483647
(или 0x7FFFFFFF
) десятичных знаков,
если хватит памяти, представленных в виде строк.
Допустимые (также известные как правильно сформированные) числа BCMath - это строки, соответствующие регулярному выражению
/^[+-]?[0]*[1-9]*[.]?[0-9]*$/
.
Передача в функции BCMath аргументов типа float, в то время как они ожидают строки могут привести к неожиданным результатам, из-за используемого PHP алгоритма преобразования float в string, например можно получить строку содержащую число в экспоненциальной нотации (который не поддерживается BCMath), или, в зависимости от локали, десятичный разделитель в виде запятой (тогда как BCMath работает только с десятичной точкой).
<?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'); // десятичная запятая вместо точки
$num2 = 1.2; // (string) 1.2 => '1,2'
echo bcsub($num1, $num2, 1); // => '0.0'
?>