# Method `%()

- Method
**`%**

`mixed`

**`%(**`object`

`arg1`

,`mixed`

`arg2`

**)**

`mixed`

**`%(**`mixed`

`arg1`

,`object`

`arg2`

**)**

`string`

**`%(**`string`

`arg1`

,`int`

`arg2`

**)**

`array`

**`%(**`array`

`arg1`

,`int`

`arg2`

**)**

`float`

**`%(**`float`

`arg1`

,`float`

|`int`

`arg2`

**)**

`float`

**`%(**`int`

`arg1`

,`float`

`arg2`

**)**

`int`

**`%(**`int`

`arg1`

,`int`

`arg2`

**)**- Description
Modulo.

Every expression with the

`%`

operator becomes a call to this function, i.e.`a%b`

is the same as`predef::`%(a,b)`

.- Returns
If

`arg1`

is an object that implements lfun::`%() then that function will be called with`arg2`

as the single argument.If

`arg2`

is an object that implements lfun::``%() then that function will be called with`arg2`

as the single argument.Otherwise the result will be as follows:

`arg1`

can have any of the following types:`string`

|`array`

If

`arg2`

is positive, the result will be the last``%(sizeof(`

),`arg1`

`arg2) elements of`

`arg1`

. If`arg2`

is negative, the result will be the first``%(sizeof(`

), -`arg1`

`arg2) elements of`

`arg1`

.`int`

|`float`

The result will be

-`arg1`

`arg2*floor(`

`arg1/`

`arg2). The result will be a float if either`

`arg1`

or`arg2`

is a float, and an int otherwise.For numbers, this means that

`a % b`

always has the same sign as`b`

(typically`b`

is positive; array size, rsa modulo, etc, and`a`

varies a lot more than`b`

).The function

`f(x) = x % n`

behaves in a sane way; as`x`

increases,`f(x)`

cycles through the values`0,1, ..., n-1, 0, ...`

. Nothing strange happens when you cross zero.The

`%`

operator implements the binary "mod" operation, as defined by Donald Knuth (see the Art of Computer Programming, 1.2.4). It should be noted that Pike treats %-by-0 as an error rather than returning 0, though.`/`

and`%`

are compatible, so that`a == b*floor(a/b) + a%b`

for all`a`

and`b`

.

- See also