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

sel*_*mar 4 r operators

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

10 %% 10  # 0
20 %% 10  # 0
Run Code Online (Sandbox Code Playgroud)

怀疑这两个结果:

10 %% 20  # 10
2 %% 8  # 2
Run Code Online (Sandbox Code Playgroud)

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

李哲源*_*李哲源 11

没有错:

10 = 1 * 10 + 0
20 = 2 * 10 + 0
10 = 0 * 20 + 10
2  = 0 * 8  + 2 
Run Code Online (Sandbox Code Playgroud)

模数是之后的数字+.


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

a = floor(a / b) * b + (a %% b)
Run Code Online (Sandbox Code Playgroud)

我们来写一个玩具功能:

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 
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*ole 8

我将提供另一种解释。拿这个问题来说:

20 %% 10 = 0
Run Code Online (Sandbox Code Playgroud)

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

20 / 10 = 2
Run Code Online (Sandbox Code Playgroud)

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

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

现在考虑一下:

11/3 = 3.667
Run Code Online (Sandbox Code Playgroud)

尾部部分,即 0.667,是在我们尽可能形成所有完整的 3 组后剩下的 3 组的一部分。在小数点左边,我们显示:

#Splitting the answer into its components - 3 full sets, 0.667 partial sets
3.0 + 0.667 = 3.667
Run Code Online (Sandbox Code Playgroud)

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

0.667 * 3 = 2
Run Code Online (Sandbox Code Playgroud)

这是剩下的部分。是全部 3 组全部组成后剩余的数量。这与我们使用模得到的结果相同:

11 %% 3 = 2
Run Code Online (Sandbox Code Playgroud)

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

10 %% 20 = 10
Run Code Online (Sandbox Code Playgroud)

我们可以正常除法并得到:

10 / 20 = 0.5
Run Code Online (Sandbox Code Playgroud)

读出来,我们有 0 个完整的组,每组 20 个(左侧);我们只有半套,即 20 套中的 0.5 套。

0.5 * 20 = 10
Run Code Online (Sandbox Code Playgroud)

这相当于:

10 %% 20 = 10
Run Code Online (Sandbox Code Playgroud)

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