Fonctions BCMath

Introduction

Pour les calculs mathématiques d'une grande précision, PHP fournit BCMath, qui supporte n'importe quelle précision et n'importe quelle taille de nombres jusqu'à 2147483647 (ou 0x7FFFFFFF) chiffres décimaux, s'il y a suffisamment de mémoire, représentés sous la forme d'une chaîne de caractères.

Les nombres BCMath valides (c.-à-d. bien formés) sont des chaînes qui correspondent à l'expression régulière /^[+-]?[0-9]*(\.[0-9]*)?$/.

Attention

Le passage de valeurs de type nombre décimal à une fonction BCMath qui attend une chaîne de caractères comme opérande peut ne pas avoir l'effet désiré en raison de la façon dont PHP convertit les valeurs nombre décimal en chaîne de caractères, à savoir que la chaîne de caractères peut être en notation exponentielle (ce qui n'est pas supporté par BCMath), et que, antérieurement à PHP 8.0.0, le séparateur décimal dépend de la locale (tandis que BCMath attend toujours un point décimal).

<?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'); // utilise une virgule décimale
$num2 = 1.2; // (string) 1.2 => '1,2'
echo bcsub($num1, $num2, 1); // => '0.0'
?>
add a note

User Contributed Notes 3 notes

up
77
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
26
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
18
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