带有负数的 Ruby 模规则不清楚。在 IRB 中:
-7 % 3 == 2
应该是1
!为什么?
当其中一个操作数%
为负时,对于返回什么结果没有明确的最佳答案。每种编程语言都有自己的规则。Modulo 操作的 Wikipedia 页面有一个巨大的表格,其中列出了每种编程语言如何决定处理这个问题,并且没有明确的共识:
$ # 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 说:
% [is] 负操作数的结果符号取决于机器
C 没有对如何处理这个问题做出特定的选择,而是返回所使用的特定硬件或编译器选择实现的任何内容!这似乎已在 C 编程语言标准的更新版本中标准化。
如果您想在 Ruby 中获取特定版本,您可以调用两种不同的方法,modulo
即 aka%
和remainder
,它们对负数有不同的行为:
$ irb
irb(main):001:0> -7.modulo(3)
=> 2
irb(main):002:0> -7.remainder(3)
=> -1
在其他没有内置方法的语言中,您最终可能会使用%
两次来获得所需的符号。