ScotlandPHP 2019

# bcmod

(PHP 4, PHP 5, PHP 7)

bcmodGet modulus of an arbitrary precision number

### Description

bcmod ( string `\$dividend` , string `\$divisor` [, int `\$scale` = 0 ] ) : string

Get the remainder of dividing `dividend` by `divisor`. Unless `divisor` is zero, the result has the same sign as `dividend`.

### Parameters

`dividend`

The dividend, as a string.

`divisor`

The divisor, as a string.

### Return Values

Returns the modulus as a string, or `NULL` if `divisor` is 0.

### Changelog

Version Description
7.2.0 `dividend` and `divisor` 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

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

Example #2 bcmod() with decimals

``` <?phpbcscale(1);echo bcmod('5.7', '1.3'); // 0.5 as of PHP 7.2.0; 0 previously?> ```

``` <?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:<?phpecho 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.6echo \$eval->evaluate('10 % -2.1'); // 1.6echo \$eval->evaluate('-10 % 2.1'); // -1.6echo \$eval->evaluate('-10 % -2.1'); // -1.6?> ```