7

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

-7 % 3 == 2  

应该是1!为什么?

4

2 回答 2

11

因为 -7/3 在 Ruby 的整数除法语义下是 -3。3*-3 为 -9,因此余数为 2。

根据文档,x 模 y 定义为:

x-y*(x/y).floor
于 2013-04-18T03:53:58.207 回答
9

当其中一个操作数%为负时,对于返回什么结果没有明确的最佳答案。每种编程语言都有自己的规则。Modulo 操作的 Wikipedia 页面有一个巨大的表格,其中列出了每种编程语言如何决定处理这个问题,并且没有明确的共识:

$ # 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 说:

% [is] 负操作数的结果符号取决于机器

C 没有对如何处理这个问题做出特定的选择,而是返回所使用的特定硬件或编译器选择实现的任何内容!这似乎已在 C 编程语言标准的更新版本中标准化。

如果您想在 Ruby 中获取特定版本,您可以调用两种不同的方法,modulo即 aka%remainder,它们对负数有不同的行为:

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

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

于 2013-04-18T03:55:33.683 回答