(PHP 4, PHP 5, PHP 7, PHP 8)
bcmod — Retourne le reste d'une division entre nombres de grande taille
Retourne le reste de la division de num1
par num2.
Le résultat a le même signe que num1.
num1L'opérande gauche, sous la forme d'une chaîne de caractères.
num2L'opérande droit, 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 la valeur par défaut de l'échelle définie avec bcscale() ,
ou utilisera la valeur de la directive INI
bcmath.scale si disponible.
Retourne le modulo, sous la forme d'une chaîne de caractères.
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.
| 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é.
|
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() avec des décimales
<?php
bcscale(1);
echo bcmod('5.7', '1.3'); // 0.5 à partir de PHP 7.2.0; 0 précédemment
?>
<?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 );
?>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
?>