如何在Ruby中找到除法的余数?

55

我试图使用 Ruby 获取除法的余数。

假设我们要将 208 除以 11。

结果应该是"18,余数为10",而我最终需要的是10

到目前为止,这是我所拥有的代码,但在这种情况下(说余数是0),它会出现问题。

division = 208.to_f / 11
rounded = (division*10).ceil/10.0
remainder = rounded.round(1).to_s.last.to_i
3个回答

77

取模运算符:

> 208 % 11
=> 10

5
我怎么把它搞得这么复杂了?谢谢。 - Shpigford
9
我不想挑剔,但它不是一个运算符,而是Fixnum类的一个方法:>> 208.%(11) #=> 10 - Michael Kohl
15
从技术上讲,所有的 Ruby "运算符" 都是方法。例如,5 + 5 实际上只是 5.+(5) 的简写形式。 - fbonetti
@fbonetti 不是所有的运算符,比如&|andnot以及一些其他的运算符都不是方法。 - Ben Aubin
2
@penne12 这并不完全正确。&|Fixnum上的方法;它们不是运算符:http://ruby-doc.org/core-2.2.0/Fixnum.html#method-i-26。 - fbonetti
显示剩余2条评论

59

如果只需要整数部分,可以使用带有 / 运算符的整数或 Numeric#div 方法:

quotient = 208 / 11
#=> 18

quotient = 208.0.div 11
#=> 18

如果您只需要余数,请使用%运算符或Numeric#modulo方法:

modulus = 208 % 11
#=> 10

modulus = 208.0.modulo 11
#=> 10.0
如果您需要同时获得商和余数,请使用Numeric#divmod方法。即使接收器或参数是浮点数,它也可以正常工作。
quotient, modulus = 208.divmod(11)
#=> [18, 10]

208.0.divmod(11)
#=> [18, 10.0]

208.divmod(11.0)
#=> [18, 10.0]

另外一个有趣的方法是Numeric#remainder方法。所有这些方法之间的差异可以在divmod文档中看到。


1
“divmod” 方法正是我所需要的,它可以同时返回商和余数。 - noraj

5

请使用Numeric#remainder,因为mod不是余数。

取模运算:

5.modulo(3)
#=> 2
5.modulo(-3)
#=> -1

提醒:

5.remainder(3)
#=> 2
5.remainder(-3)
#=> 2

这是一个关于问题讨论的链接:https://rob.conery.io/2018/08/21/mod-and-remainder-are-not-the-same/

该链接解释了mod与remainder不同的问题,特别是在IT技术领域中常常混淆两者的概念。如果你想更好地理解这一点,阅读本链接将会对你有所帮助。

我完全不同意“余数”和“模运算”有唯一定义的说法。虽然代数中有模运算,但在编程语言中有不同的实现方式。请注意,11 = 3 mod 4 在代数中成立,但是 11 mod 4 = 3 却不成立。 - Zane
我必须对@Zane上面的说法提出异议。在代数中,表达式11 = 3 mod 4不包含运算符; mod在这里不是运算符。它只是对于数字系统中的3的描述。为了避免混淆,通常会写成11 = 3 (mod 4) - Adam Sibik
@AdamSibik。我不知道你为什么认为你“必须反对”。从我的角度来看,你的评论支持这个说法:没有唯一的定义。 - Zane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接