我正在寻找一个关于Ruby的模运算如何工作以及为什么在Ruby中的简单解释
puts 4 % 3 # 1
puts -4 % 3 # 2 <--why?
puts -4 % -3 # -1
Run Code Online (Sandbox Code Playgroud)
但在PHP中:
<?php
echo 4 % 3; # 1
echo -4 % 3; # -1
echo -4 % -3; # -1
Run Code Online (Sandbox Code Playgroud)
在我看来像-4%3实际上是8%3(8是4和-4之间的差异).
Oli*_*rth 15
根据您的定义,它们都可以被认为是正确的.如果a % n == r,则应该认为:
a == q*n + r
Run Code Online (Sandbox Code Playgroud)
哪里q == a / n.
无论r是正面还是负面,都取决于价值q.所以在你的例子中,以下任何一个:
-4 == -1*3 + (-1) // PHP
-4 == -2*3 + 2 // Ruby
Run Code Online (Sandbox Code Playgroud)
换句话说,定义%取决于定义/.
另见下表:http://en.wikipedia.org/wiki/Modulus_operator#Remainder_calculation_for_the_modulo_operation.您会发现各种编程语言之间存在很大差异.
以下是 Matz和David Flanagan撰写的关于Ruby编程语言主题的片段.
当一个(但不是两个)操作数都是负数时,Ruby执行整数除法和模运算与C,C++和Java这样的语言不同(但与Python和Tcl语言相同).考虑商-7/3.Ruby向负无穷大舍入并返回-3.C和相关语言向零舍入而返回-2.在Ruby中,-a/b等于/ -b但不等于 - (a/b).
Ruby对模块操作的定义也与C和Java不同.在Ruby中,-7%3是2.在C和Java中,结果是-1.结果的大小不同,因为商不同.但结果的标志也不同.在Ruby中,结果的符号始终是第二个操作数的符号.在C和Java中,结果的符号始终是第一个操作数的符号.(Ruby的余数方法的行为类似于C模运算符.)