Skip to content

取余和取模的区别

注:以下使用 a % b 表示取余和取模运算

如果a和b都是正数,取余和取模没区别

例如,对于2 % 7,取余和取模的结果都是2,对于9 % 7,取余和取模的结果也都是2

取余运算

例如,

  • 12 / 7 = 1 ... 5,即,12 % 7 = 5
  • 12 / -7 = -1 ... 5,即,12 % -7 = 5
  • -12 / 7 = -1 ... -5,即,-12 % 7 = -5
  • -12 / -7 = 1 ... -5,即,-12 % -7 = -5

不难看出,余数和被除数的符号永远相等

取余运算强调的是余量

取模运算

取模运算强调的是,对于一个取值范围有限的计量系统,随便拿一个数过来,它在这个计量系统里对应的是几

例如,一个时钟的取值范围是0~11,一共12个数,即这个时钟的模为12。如果我们把时针顺时针走看作正,逆时针走看作负,那么,-3点相当于时针从0点开始,逆时针走三个点,就等同于9点,21点相当于时针从9点开始,顺时针转了一整圈,还是等同于9点,而9点本身就是9点,也就是说

  • -3 对 12取模的结果是9,即 -3 % 12=9
  • 9 对 12取模的结果是9,即 9 % 12=9
  • 21 对 12取模的结果是9,即 21 % 12=9

当模为负数时,同样有

  • 3 % -12 = -9
  • -9 % -12 = -9
  • -21 % -12 = -9

计算公式

如果把取余和取模整理成计算公式

那么 a % b = a - floor(a/b)×b,其中floor表示向下取整 - 对于取余运算,floor是向0取整 - 对于取模运算,floor是向负无穷取整

当a和b都是正数或都是负数的时候,它们相除的结果都是正数,向0取整和向负无穷取整是等价的,所以取余和取模的结果是一样的

当a和b符号不同时,取余和取模就不同了

不同语言处理不一样

在很多编程语言里都有取余或取模运算,运算符一般是%,有的语言里%是取余操作,有的语言里%是取模操作

注意不要混淆类型转换和向下取整,例如在python中,int(-5/3)是从float向int的类型转换,是直接将尾数丢掉,结果是-1,而向下取整是一个算数操作,而-5//3才是向下取整。其他语言同理。

golang

在golang中,向下取整操作是向0取整,因此,go中的%操作是取余操作

fmt.Println(math.Floor(-5,3)) //输出-1
fmt.Println(-5 % 3) //输出-2

python

在python中,向下取整操作是向负无穷取整,因此,python中的%操作是取模操作

print(-5//3)  # 输出-2
print(-5 % 3)  # 输出1