This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.
对于任意精度的数学, 如果有足够多的内存,PHP 提供的 BCMath 支持用字符串的形式表示任意大小和精度的数字,最大尺寸为
2147483647(即 0x7FFFFFFF)。
有效(即格式良好)的 BCMath 数字是匹配正则表达式
/^[+-]?[0-9]*(\.[0-9]*)?$/ 的字符串。
BCMath 函数想要操作的是 string,如果传入了 float 可能无法达到想要的效果, 因为 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'
?>This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.Note that when you use implementation of factorial that ClaudiuS made, you get results even if you try to calculate factorial of number that you normally can't, e.g. 2.5, -2, etc. Here is safer implementation:
<?php
/**
* Calculates a factorial of given number.
* @param string|int $num
* @throws InvalidArgumentException
* @return string
*/
function bcfact($num)
{
if (!filter_var($num, FILTER_VALIDATE_INT) || $num <= 0) {
throw new InvalidArgumentException(sprintf('Argument must be natural number, "%s" given.', $num));
}
for ($result = '1'; $num > 0; $num--) {
$result = bcmul($result, $num);
}
return $result;
}
?>Needed to compute some permutations and found the BC extension great but poor on functions, so untill this gets implemented here's the factorial function:
<?php
/* BC FACTORIAL
* n! = n * (n-1) * (n-2) .. 1 [eg. 5! = 5 * 4 * 3 * 2 * 1 = 120]
*/
function bcfact($n){
$factorial=$n;
while (--$n>1) $factorial=bcmul($factorial,$n);
return $factorial;
}
print bcfact(50);
//30414093201713378043612608166064768844377641568960512000000000000
?>