我正在尝试理解R语言中的%%
运算符的工作原理:
10 %% 10 # 0
20 %% 10 # 0
我对这两个结果不太确定:
10 %% 20 # 10
2 %% 8 # 2
你能帮我理解最后两个结果吗?我有点困惑。
没什么问题:
10 = 1 * 10 + 0
20 = 2 * 10 + 0
10 = 0 * 20 + 10
2 = 0 * 8 + 2
取模运算是在加号后面的数字。
一般来说,对于两个数字 a
和 b
,有
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
更新:我们可以使用 a %/% b
来获取商,而不是使用 floor(a / b)
。
我将提供另一个解释。拿这个问题举例:
20 %% 10 = 0
不要计算模数,而是从简单的除法开始:
20 / 10 = 2
如您所知,“2”这个答案意味着需要两组10才能组成20。请注意,我们也可以用小数“2.0”来表示这个答案。
小数很重要。当小数为.0时,就没有余数了,我们有完整的组。如果除法产生一个0小数,那么模运算结果是0。
现在考虑一下这个问题:
11/3 = 3.667
#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
11 %% 3 = 2
10 %% 20 = 10
10 / 20 = 0.5
读出来,我们有0个完整的20人小组(左边);我们只有半套20人(即0.5个)。
0.5 * 20 = 10
10 %% 20 = 10
因此,10就是余数。它是我们所拥有的10和到达20所需的10之间的差距。
x mod y = x - ( |_x/y_| * y)
,其中|_x/y_| = floor(x/y)
在R中似乎总是成立,或者更标准地说,操作q = x / y
的余数r
的定义是x = k*q + r
,其中k
和r
都是整数。
基本上,在R中,当x = 2
且y = -5
时,x mod y = -3
;或者使用定义x = k*q + r
,我们有r = x - k*q = -3
。
然而,从数学角度来看,这有点古怪,因为“整数部分乘积” (k*q
) 实际上超过了被除数 (x
),从而将余数 (r
) 定义为负整数...
x <- 2
y <- -5
q <- x/y
k <- floor(2/-5)
kq <- floor(2/-5) * -5
r <- 2 - (floor(2/-5) * -5)
x %% y
remainder <- dividend %% divisor
文档唯一缺少的是有关被除数和除数哪边的细节。 维基百科将这两个术语描述为:
被除数称为被除数,它被除以除数,结果称为商。 在此示例中,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
10 %% 20
返回0,你实际上可能想要执行的是20 %% 10
。 - Benjamin