问题
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) =?
回答1:
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.
回答2:
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.
回答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.
回答4:
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
来源:https://stackoverflow.com/questions/4409281/how-is-13-64-13-in-php