Для математичних обчислень з довільною точністю PHP пропонує
розширення BC Math, яке дозволяє оперувати числами будь-якого розміру і
точності, представленими у вигляді рядків, аж до
2147483647
(0x7FFFFFFF
) знаків або
обмежуючись виділеною пам'яттю.
Правильними числами для BCMath є рядки, що відповідають регулярному виразу
/^[+-]?[0-9]*(\.[0-9]*)?$/
.
Передавання числа типу float в функції BCMath, які очікують операнди типу string, може не мати бажаного ефекту через спосіб, яким PHP перетворює float-значення в string, а саме: рядок (string) може отримати експонентний запис числа (що не підтримується BCMath); до PHP 8.0.0 символ десяткового розділювача залежить від локалі (тоді як 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'
?>