PHP: bcmod - Manual
(PHP 4, PHP 5, PHP 7, PHP 8)
bcmod — Get modulus of an arbitrary precision number
Description
Parameters
num1-
The left operand, as a string.
num2-
The right operand, as a string.
scale-
This parameter is used to set the number of digits after the decimal place in the result.
If
null, it will default to the default scale set with bcscale(), or fallback to the value of thebcmath.scaleINI directive.
Return Values
Returns the modulus as a string.
Errors/Exceptions
This function throws a ValueError in the following cases:
-
num1ornum2is not a well-formed BCMath numeric string. -
scaleis outside the valid range.
This function throws a DivisionByZeroError
exception if num2 is 0.
Changelog
| Version | Description |
|---|---|
| 8.0.0 |
scale is now nullable.
|
| 8.0.0 |
Dividing by 0 now throws a DivisionByZeroError exception instead of returning null.
|
| 7.2.0 |
num1 and num2 are no
longer truncated to integer, so now the behavior of
bcmod() follows fmod() rather than
the % operator.
|
| 7.2.0 |
The scale parameter was added.
|
Examples
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
?>See Also
- bcdiv() - Divide two arbitrary precision numbers
- bcdivmod() - Get the quotient and modulus of an arbitrary precision number
- BcMath\Number::mod() - Gets the modulus of an arbitrary precision number
Found A Problem?
22 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 );
?>drahoszdenek at gmail dot com ¶
13 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
?>