取余和取模的区别
注:以下使用 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