理解模运算符的结果:%%

时间:2016-07-22 10:59:36

标签: r operators

我正在寻找适用于R语言的%%运算符的方法。

10 %% 10  # 0
20 %% 10  # 0

怀疑这两个结果:

10 %% 20  # 10
2 %% 8  # 2

你能帮助我更好地理解最后两个结果吗?我有点困惑。

5 个答案:

答案 0 :(得分:10)

没错:

10 = 1 * 10 + 0
20 = 2 * 10 + 0
10 = 0 * 20 + 10
2  = 0 * 8  + 2 

模数是+之后的数字。

一般来说,对于两个数字ab,有

a = floor(a / b) * b + (a %% b)

让我们写一个玩具功能:

foo <- function(a,b) c(quotient = floor(a / b), modulo = a %% b)

foo(10, 10)
#quotient   modulo 
#   1        0 

foo(20, 10)
#quotient   modulo 
#   2        0 

foo(10, 20)
#quotient   modulo 
#   0       10 

foo(2, 8)
#quotient   modulo 
#   0        2 

更新:我们也可以使用floor(a / b)而不是a %/% b来获取商数。

答案 1 :(得分:1)

我也很困惑,但如果你明白 %% 运算符的结果是除法的余数,那就很容易了。

例如。 75%%4 = 3

并且我注意到如果 dividend 小于 divisor,那么 R 返回相同的 dividend 值。

例如。 4%%75 = 4

10%% 20 = 10 2%% 8 = 2

干杯

division parts

答案 2 :(得分:1)

我会提供另一种解释。解决这个问题:

20 %% 10 = 0

不要评估模数,而是从简单的除法开始:

20 / 10 = 2

如您所知,答案“2”意味着需要两组 10 才能得到 20。请注意,我们也可以将答案写成小数点 2.0。

小数点很重要。当小数为 .0 时,我们没有余数。我们有全套。如果除法产生 0 小数,则模计算为零。

现在考虑:

11/3 = 3.667

尾部 0.667 是一组 3 中剩余的部分在我们形成所有完整的 3 组之后。在小数点的左边,我们显示:

#Splitting the answer into its components - 3 full sets, 0.667 partial sets
3.0 + 0.667 = 3.667

所以如果我们想知道实际剩余数量,我们可以将 0.667 乘以除数,3:

0.667 * 3 = 2

这是剩下的。它是在所有完整的 3 组形成后剩余的数量。这与我们使用模得到的结果相同:

11 %% 3 = 2

这里同样适用。鉴于这个问题,

10 %% 20 = 10

我们可以正常除以得到:

10 / 20 = 0.5

读到这里,我们有 0 个完整的 20 组(左侧);我们只有半组,0.5,20。

0.5 * 20 = 10

这相当于:

10 %% 20 = 10

10 因此是余数。这是我们拥有的 10 个与达到 20 个所需的 10 个之间的差距。

答案 3 :(得分:0)

尝试用x modulo来理解R中的一些结果我找到了这个页面。然后试着向自己解释一些&#34; querky&#34;结果我在下面写了这个R脚本。我已经读过模数运算符的余数或结果应该总是正数,但在R中不是这种情况,这里提供的定义和示例解释了似乎使用的逻辑。定义&#34; x mod y = x - (| x / y | * y)&#34;其中| x / y | = floor(x / y)似乎在R中始终为真,或者以更标准的方式,余数的定义&#34; r&#34;操作q = x / y是x = k q + r,其中k和r都是整数。 我的脚本的评论是用法语发表的,所以我删除了它们,但是没有必要理解...... 基本上在R中,x = 2且y = -5,x mod y = -3;或者使用定义x = k q + r我们有r = x - k q = -3。 尽管如此,这在数学意义上是一种颤抖,因为&#34;整数部分产品&#34; (k q)实际上超过了被除数(x),因此将余数(r)定义为负整数......

x < - 2

y&lt; - -5

q&lt; - x / y

k&lt; - floor(2 / -5)

kq&lt; - floor(2 / -5)* -5

r&lt; - 2 - (floor(2 / -5)* -5)

x %% y

答案 4 :(得分:0)

语法

remainder <- dividend %% divisor

详细信息

documentations中唯一缺少的是细节,哪一边是股息,哪一边是除数Wikipedia将两个术语描述为:

被除数称为除数,除数除以除数,结果称为商。在此示例中,红利为20,除数为5,商为4。

但是,与除法运算相比,取模运算不返回。而是返回余数

示例

要轻松理解模运算,最好是股息> 除数

12 %% 11
# quotient is 1.090909
# remainder is 1

12 %% 10
# quotient is 1.2
# remainder is 2

12 %% 9
# quotient is 1.333333
# remainder is 3

12 %% 8
# quotient is 1.5
# remainder is 4

12 %% 7
# quotient is 1.714286
# remainder is 5

12 %% 6
# quotient is 2
# remainder is 0
# 12 is divisible by 6

12 %% 5
# quotient is 2.4
# remainder is 2

12 %% 4
# quotient is 3
# remainder is 0
# 12 is divisible by 4

12 %% 3
# quotient is 4
# remainder is 0
# 12 is divisible by 3

12 %% 2
# quotient is 6
# remainder is 0
# 12 is divisible by 2

12 %% 1
# quotient is 12
# remainder is 0
# any whole number is divisible by 1