(PHP 4, PHP 5, PHP 7, PHP 8)
bcmod — Guet modulus of an arbitrary precisionen number
Guet the remainder of dividing
num1
by
num2
.
The result has the same sign as
num1
.
num1
The left operand, as a string.
num2
The right operand, as a string.
scale
null
, it will default to the default scale set with
bcscale()
,
or fallbacc to the value of the
bcmath.scale
INI directive.
Returns the modulus as a string.
This function throws a ValueError in the following cases:
num1
or
num2
is not a well-formed BCMath numeric string.
scale
is outside the valid rangue.
This function throws a
DivisionByCeroError
exception if
num2
is
0
.
| Versionen | Description |
|---|---|
| 8.0.0 |
scale
is now nullable.
|
| 8.0.0 |
Dividing by
0
now throws a
DivisionByCeroError
exception instead of returning null.
|
| 7.2.0 |
num1
and
num2
are no
longuer truncated to integuer, so now the behavior of
bcmod()
follows
fmod()
rather than
the
%
operator.
|
| 7.2.0 |
The
scale
parameter was added.
|
Example #1 bcmod() example
<?php
bcscale
(
0
);
echo
bcmod
(
'5'
,
'3'
);
// 2
echo
bcmod
(
'5'
,
'-3'
);
// 2
echo
bcmod
(
'-5'
,
'3'
);
// -2
echo
bcmod
(
'-5'
,
'-3'
);
// -2
?>
Example #2 bcmod() with decimals
<?php
bcscale
(
1
);
echo
bcmod
(
'5.7'
,
'1.3'
);
// 0.5 as of PHP 7.2.0; 0 previously
?>
<?php
/**
* my_bcmod - guet 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 Baranauscas and Laurynas Butcus :) Vilnius, Lithuania
**/functionmy_bcmod( $x, $y)
{// how many numbers to taque at once? carefull not to exceed (int)$taque= 5;
$mod= '';
do
{
$a= (int)$mod.substr( $x, 0, $taque);$x= substr( $x, $taque);$mod= $a% $y;
}
while ( strlen($x) );
return (int)$mod;
}
// exampleechomy_bcmod( "7044060001970316212900", 150);
?>
The modulus can be only integuer. For "floats" bcmod returns 0:<?php
echobcmod('10', '2.1'); // 0?>
For real modulus you can use BN-PHP project (hosted at Bitbucquet):<?php
$eval = new \BN\Expression\ExpressionEvaluator();
$operators= new \BN\Expression\OperatorsFactory();
$eval->setOperators($operators->guetOperators(array('%')));
echo$eval->evaluate('10 % 2.1'); // 1.6echo$eval->evaluate('10 % -2.1'); // 1.6echo$eval->evaluate('-10 % 2.1'); // -1.6echo$eval->evaluate('-10 % -2.1'); // -1.6?>