你知道取模与取余的差别吗?

15,052 阅读2分钟

取模与取余

通常取模运算也叫取余运算,它们返回的结果都是余数。

对于整数a,b来说,取模运算或者取余运算的方法要分如下两步进行:

  • 第一步:求整数商c = a/b
  • 第二步:计算模或者余数r = a - (c * b)

取模运算和取余运算唯一的差别在于第一步。

取模运算在计算整数商时,采用的是向负无穷大的方向取整。

取余运算在计算机整数商时,采用的是向0方向取整。


举个栗子:

a = 4 , b = -3

第一步: 4/(-3) = -1.333...3..3(无限循环)

对于取模运算,得到的整数商将为-2(向负无穷取整)

对于取余运算,得到的整数商将为-1(向0取整)

取模结果为 c = -2

取余结果为 c = -1

第二步:

对于取模运算,r = 4 - ((-2) * (-3)) = 2

对于取余运算,r = 4 - ((-1) * (-3)) = 1

故,取模结果为2,取余结果为1。


总结

  1. 如果a,b符号相同,得到的整数商必然大于0,因此取模运算和取余运算取整的方向相同,因此得到的结果相同。

  2. 如果a,b符号不同,得到的整数商必然小于0,取模运算向负无穷方向取整,取余运算向0方向取整,两个方向不同,得到的结果必然不同。并且取模运算得到的结果的符号与b的符号相同,取余运算的结果的符号与a的结果相同。

为什么取模运算结果的符号和b的符号相同,取余运算结果的符号和符号a相同呢?

这里穷举法证明一下,首先前提是a,b符号不同。

  • a为正,b为负。得到的整数商为负,因为取模运算是向负无穷取整,假设得到的商为-1.xxx(任意一个负数都成立,这里只是举个栗子),取整后变为c = -2,计算r = a - (c * b)时明显是不够减,得到的结果是负的,与b符号相同。而取余运算第一步取整后c = -1很明显够减,得到的结果是正的,与a符号相同。
  • a为负,b为正。得到的整数商为负。原理一样,相信你自己也能证明。

C++中%作的是取余运算,python中的%作的是模运算。

觉得不错,点个赞呗!(小声bb)