How is -13 d = -13 in PHP?

后端 未结 4 888
南笙
南笙 2020-12-06 17:45

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

Anywhere to force PHP to return positive 51?

update

相关标签:
4条回答
  • 2020-12-06 17:50

    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

    0 讨论(0)
  • 2020-12-06 17:56

    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.

    0 讨论(0)
  • 2020-12-06 17:58

    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.

    0 讨论(0)
  • 2020-12-06 17:59

    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.

    0 讨论(0)
提交回复
热议问题