带负数的Ruby modulo 3不直观

时间:2013-04-18 03:23:21

标签: ruby modulo

带有负数的Ruby模数规则尚不清楚。在IRB:

-7 % 3 == 2  

应该是1! 为什么呢?

2 个答案:

答案 0 :(得分:6)

%的其中一个操作数为负数时,没有明确的最佳答案 为了什么结果返回。每种编程语言都有自己的规则。 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

在其他没有内置方法的语言中,您可能会结束 使用%两次来获得所需的符号。

答案 1 :(得分:5)

因为-7/3在Ruby的整数除法语义下是-3。 3 * -3是-9,所以留下2的剩余部分。

根据the docs,x modulo y定义为:

x-y*(x/y).floor