# How is -13 % 64 = -13 in PHP?

Derived from this question : (Java) How does java do modulus calculations with negative numbers?

Anywhere to force PHP to return positive 51?

update
Looking for a configuration setting to fix, instead hard-guessing

Or other math function like bcmath?

updated
Not entire convinced by that java answer, as it does not take account of negative modulus
`-13+(-64) =?`

## Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

### Solution 1

Anyway, the post you referenced already gave the correct answer:

``````\$r = \$x % \$n;
if (\$r < 0)
{
\$r += abs(\$n);
}
``````

Where \$x = -13 and \$n = 64.

### Solution 2

If GMP is available, you can use `gmp_mod`

Calculates n modulo d. The result is always non-negative, the sign of d is ignored.

Example:

``````echo gmp_strval(gmp_mod('-13', '64')); // 51
``````

Note that `n` and `d` have to be GMP number resources or numeric strings. Anything else won’t work¹

``````echo gmp_strval(gmp_mod(-13, 64));
echo gmp_mod(-13, 64);
``````

will both return -51 instead (which is a bug).

¹ running the above in this codepad, will produce 51 in all three cases. It won’t do that on my development machine.

### Solution 3

The modulo operation should find the remainder of division of a number by another. But strictly speaking in most mainstream programming languages the modulo operation malfunctions if dividend or/and divisor are negative. This includes PHP, Perl, Python, Java, C, C++, etc.

Why I say malfunction? Because according to mathematic definition, a remainder must be zero or positive.

The simple solution is to handle the case yourself:

``````if r < 0  then r = r + |divisor|;
``````

|divisor| is the absolute value of divisor.

Another solution is to use a library (as @Gordon pointed). However I wouldn’t use a library to handle a simple case like this.

### Solution 4

I hate using `if` in this case when you can calculate it right away.

``````\$r = (\$x % \$n + \$n) % \$n;
``````

when `\$n` is positive.

### Solution 5

The PHP manual says that

The result of the modulus operator % has the same sign as the dividend — that is, the result of \$a % \$b will have the same sign as \$a. For example

so this is not configurable. Use the options suggested in the question you linked to

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0