Hướng dẫn dùng php bcmod trong PHP

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

Show

bcmodGet modulus of an arbitrary precision number

Description

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

Parameters

num1

The dividend, as a string.

num2

The divisor, as a string.

Return Values

Returns the modulus as a string, or null if num2 is 0.

Changelog

VersionDescription
8.0.0 scale is now nullable.
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

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

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

lauris at night dot lt

18 years ago

/**
* 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

9 years ago

The modulus can be only integer. For "floats" bcmod returns 0:

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

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

$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
?>