PHP 中的取余数操作

这个细节一直没有注意,今天补上。

一般我们取余操作都是直接用”%”这个操作符来完成,但是这个操作符受到运行环境的限制,被余数不能超过PHP_INT_MAX,所以官方提供了bcmod这个函数来对任意数进行取余数操作。

运行下面的代码,可以看到效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * 这个在官方评论中找到的一个对任意数取余的函数实现(看了下是10年写下的)
 * 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
$a =  "7044060001970316212900";
$b = 150;
echo my_bcmod($a, $b ).PHP_EOL;
echo bcmod($a, $b).PHP_EOL;
echo $a % $b;