PHP 8.4.2 Released!

bcmod

(PHP 4, PHP 5, PHP 7, PHP 8)

bcmodRetourne le reste d'une division entre nombres de grande taille

Description

bcmod(string $num1, string $num2, ?int $scale = null): string

Retourne le reste de la division entre num1 en utilisant num2. Le résultat a le même signe que num1.

Liste de paramètres

num1

L'opérande gauche, sous la forme d'une chaîne de caractères.

num2

L'opérande droite, sous la forme d'une chaîne de caractères.

scale
Ce paramètre est utilisé pour définir le nombre de chiffres après la virgule dans le résultat. Si null, il prendra par défaut la valeur définie par bcscale(), ou, à défaut, la valeur de la directive INI bcmath.scale.

Valeurs de retour

Retourne le modulo, sous la forme d'une chaîne de caractères.

Erreurs / Exceptions

Cette fonction lève une exception ValueError dans les cas suivants :

  • num1 ou num2 n'est pas une chaîne numérique BCMath correctement formée.
  • scale est en dehors de la plage valide.

Cette fonction lève une exception DivisionByZeroError si num2 est égal à 0.

Historique

Version Description
8.0.0 scale est désormais nullable.
8.0.0 La division par 0 lève désormais une exception DivisionByZeroError au lieu de retourner null.
7.2.0 num1 et num2 ne sont plus tronqués en entier. Le comportement de bcmod() suit fmod() plutôt que l'opérateur %.
7.2.0 Le paramètre scale a été ajouté.

Exemples

Exemple #1 Exemple avec bcmod()

<?php
bcscale
(0);
echo
bcmod( '5', '3'); // 2
echo bcmod( '5', '-3'); // 2
echo bcmod('-5', '3'); // -2
echo bcmod('-5', '-3'); // -2
?>

Exemple #2 bcmod() aved des décimales

<?php
bcscale
(1);
echo
bcmod('5.7', '1.3'); // 0.5 depuis PHP 7.2.0; 0 precédement
?>

Voir aussi

  • bcdiv() - Divise deux nombres de grande taille
  • bcdivmod() - Renvoie le quotient et le reste d'un nombre de précision arbitraire

add a note

User Contributed Notes 2 notes

up
5
lauris at night dot lt
20 years ago
<?php
/**
* my_bcmod - get modulus (substitute for bcmod)
* string my_bcmod ( string left_operand, int modulus )
* left_operand can be really big, but be carefull with modulus :(
* by Andrius Baranauskas and Laurynas Butkus :) Vilnius, Lithuania
**/
function my_bcmod( $x, $y )
{
// how many numbers to take at once? carefull not to exceed (int)
$take = 5;
$mod = '';

do
{
$a = (int)$mod.substr( $x, 0, $take );
$x = substr( $x, $take );
$mod = $a % $y;
}
while (
strlen($x) );

return (int)
$mod;
}

// example
echo my_bcmod( "7044060001970316212900", 150 );
?>
up
1
drahoszdenek at gmail dot com
11 years ago
The modulus can be only integer. For "floats" bcmod returns 0:

<?php
echo bcmod('10', '2.1'); // 0
?>

For real modulus you can use BN-PHP project (hosted at Bitbucket):

<?php
$eval
= new \BN\Expression\ExpressionEvaluator();
$operators = new \BN\Expression\OperatorsFactory();
$eval->setOperators($operators->getOperators(array('%')));

echo
$eval->evaluate('10 % 2.1'); // 1.6
echo $eval->evaluate('10 % -2.1'); // 1.6
echo $eval->evaluate('-10 % 2.1'); // -1.6
echo $eval->evaluate('-10 % -2.1'); // -1.6
?>
To Top