Правила Ruby по модулю с отрицательными номерами неясны. В IRB:Ruby modulo 3 с отрицательными номерами неинтересен
-7 % 3 == 2
Должно быть 1
! Почему?
Правила Ruby по модулю с отрицательными номерами неясны. В IRB:Ruby modulo 3 с отрицательными номерами неинтересен
-7 % 3 == 2
Должно быть 1
! Почему?
Поскольку -7/3 составляет -3 по семантике деления на Ruby. 3 * -3 -9, так что бы оставить остаток 2.
В соответствии с the docs, х по модулю у определяется следующим образом:
x-y*(x/y).floor
Когда один из операндов %
является отрицательным, есть нет четкого лучшего ответа за какой результат вернуть. Каждый язык программирования имеет свои собственные правила. Страница Wikipedia для Modulo operation имеет гигантскую таблицу как каждый язык программирования решил справиться с этим, и нет никакого ясного консенсуса:
$ # Modulus sign is:
$
$ curl 'http://en.wikipedia.org/w/index.php?title=Modulo_operation&action=edit§ion=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
В других языках, которые дон Для этого у вас есть встроенные методы, вы можете закончить , используя %
дважды, чтобы получить желаемый знак.
Nope. Должно быть либо 2, либо -1, но ** никогда ** 1. –