Search code examples
iosswift

Negative number modulo in swift


How does modulo of negative numbers work in swift ? When i did (-1 % 3) it is giving -1 but the remainder is 2. What is the catch in it?


Solution

  • The Swift remainder operator % computes the remainder of the integer division:

    a % b = a - (a/b) * b
    

    where / is the truncating integer division. In your case

    (-1) % 3 = (-1) - ((-1)/3) * 3 = (-1) - 0 * 3 = -1
    

    So the remainder has always the same sign as the dividend (unless the remainder is zero).

    This is the same definition as required e.g. in the C99 standard, see for example Does either ANSI C or ISO C specify what -5 % 10 should be?. See also Wikipedia: Modulo operation for an overview how this is handled in different programming languages.

    A "true" modulus function could be defined in Swift like this:

    func mod(_ a: Int, _ n: Int) -> Int {
        precondition(n > 0, "modulus must be positive")
        let r = a % n
        return r >= 0 ? r : r + n
    }
    
    print(mod(-1, 3)) // 2