Модуль математических операций с числами произвольной точности BCMath

Введение

Для математических операций с числами произвольной точности PHP предлагает модуль BCMath. Модуль поддерживает числа произвольного размера с точностью до 2 147 483 647, или 0x7FFFFFFF, десятичных знаков, если хватит памяти. Модуль представляет числа в виде строк.

Допустимые, или правильно сформированные, числа модуля BCMath — строки, которые соответствуют регулярному выражению: /^[+-]?[0-9]*(\.[0-9]*)?$/.

Предостережение

Передача float-значений в функции модуля BCMath, которые ожидают строковый операнд, иногда даёт неожиданные результаты. Причина состоит в способе, которым PHP преобразовывает значения с плавающей точкой (float) в строки (string). В ряде преобразований возвращается числовая строка в экспоненциальной нотации или числовая строка с десятичным разделителем в виде запятой; до 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'

?>
  • Установка и настройка
  • Функции модуля BC Math
    • bcadd — Складывает два числа произвольной точности
    • bcceil — Округляет число произвольной точности в большую сторону
    • bccomp — Сравнивает два числа произвольной точности
    • bcdiv — Делит два числа произвольной точности
    • bcdivmod — Получает неполное частное и остаток от деления числа произвольной точности
    • bcfloor — Округляет число произвольной точности в меньшую сторону
    • bcmod — Получает остаток от деления чисел произвольной точности
    • bcmul — Умножает два числа произвольной точности
    • bcpow — Возводит в степень число произвольной точности
    • bcpowmod — Возводит число произвольной точности в степень и делит результат возведения в степень на модуль числа
    • bcround — Округляет число произвольной точности
    • bcscale — Устанавливает или получает количество цифр после десятичной точки по умолчанию для функций модуля BCMath
    • bcsqrt — Извлекает квадратный корень из числа произвольной точности
    • bcsub — Вычитает одно число произвольной точности из другого
  • BcMath\Number — Класс BcMath\Number
    • BcMath\Number::add — Складывает числа произвольной точности
    • BcMath\Number::ceil — Округляет число произвольной точности в бо́льшую сторону
    • BcMath\Number::compare — Сравнивает два числа произвольной точности
    • BcMath\Number::__construct — Создаёт новый объект BcMath\Number
    • BcMath\Number::div — Делит числа произвольной точности
    • BcMath\Number::divmod — Получает неполное частное и остаток от деления числа произвольной точности
    • BcMath\Number::floor — Округляет число произвольной точности в меньшую сторону
    • BcMath\Number::mod — Получает остаток от деления числа произвольной точности
    • BcMath\Number::mul — Умножает число произвольной точности
    • BcMath\Number::pow — Возводит число произвольной точности в степень
    • BcMath\Number::powmod — Возводит число произвольной точности в степень и делит результат возведения в степень на модуль числа
    • BcMath\Number::round — Округляет число произвольной точности
    • BcMath\Number::__serialize — Сериализует объект BcMath\Number
    • BcMath\Number::sqrt — Извлекает квадратный корень из числа произвольной точности
    • BcMath\Number::sub — Вычитает из числа произвольной точности
    • BcMath\Number::__toString — Преобразовывет объект BcMath\Number в строку
    • BcMath\Number::__unserialize — Десериализует данные в объект BcMath\Number
Добавить

Примечания пользователей 3 notes

up
75
Hayley Watson
10 years ago
This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.
up
21
volek at adamv dot cz
11 years ago
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;
}
?>
up
19
ClaudiuS
13 years ago
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
?>
To Top