2013-04-18 1 views

ответ

2

Поскольку -7/3 составляет -3 по семантике деления на Ruby. 3 * -3 -9, так что бы оставить остаток 2.

В соответствии с the docs, х по модулю у определяется следующим образом:

x-y*(x/y).floor 
6

Когда один из операндов % является отрицательным, есть нет четкого лучшего ответа за какой результат вернуть. Каждый язык программирования имеет свои собственные правила. Страница Wikipedia для Modulo operation имеет гигантскую таблицу как каждый язык программирования решил справиться с этим, и нет никакого ясного консенсуса:

$ # Modulus sign is: 
$ 
$ curl 'http://en.wikipedia.org/w/index.php?title=Modulo_operation&action=edit&section=1' \ 
    | egrep -o 'Divisor|Dividend|Always positive|Closest to zero|Not defined|Implementation defined' \ 
    | sort | uniq -c | sort -nr 

    67 Dividend 
    42 Divisor 
    7 Always positive 
    4 Closest to zero 
    2 Not defined 
    2 Implementation defined 

Некоторые выбирают знак левого операнда, а некоторых из них правый операнд. Другие не уточняют. Например, The C Programming Language говорит:

знак результата для% [это] машинно-зависимая для отрицательных операндов

Вместо того, чтобы конкретный выбор для того, как справиться с этим, C только возвращает то, что используется конкретное оборудование или компилятор, выбрали для реализации! Это, по-видимому, стандартизировано в более поздних версиях стандартов языка программирования C.

Если вы хотите, чтобы получить конкретную версию в Ruby, есть два различных методы, которые вы могли бы назвать, modulo aka % и remainder, с различным поведением на отрицательных чисел:

$ irb 
irb(main):001:0> -7.modulo(3) 
=> 2 
irb(main):002:0> -7.remainder(3) 
=> -1 

В других языках, которые дон Для этого у вас есть встроенные методы, вы можете закончить , используя % дважды, чтобы получить желаемый знак.