对于任意精度数学,PHP 提供了 BCMath,它支持任意大小和精度的数字,最多 2147483647
(或 0x7FFFFFFF
)位十进制数字,如果内存足够,以字符串表示。
有效的(也称为格式良好的)BCMath 数字是与正则表达式 /^[+-]?[0-9]*(\.[0-9]*)?$/
匹配的字符串。
将类型为 float 的值传递给期望 string 作为操作数的 BCMath 函数可能无法产生预期效果,因为 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'
?>