负数取模

Copy
(-7)%10 = ?

有两个答案：-7 或 3

这就要说到编程语言对于模运算的定义

Copy
r = a - (a / b) * b

这其中对于除法运算 a / b 有两种不同的取整方式，一种是向 0 取整，一种是向负无穷取整。这就导致了取模会有两种结果。

例如：

-7/10 向 0 取整，得到的结果是 0，如果向负无穷取整得到的结果是 -1。因此，如果采用向 0 取整的方式，-7%10 结果就是 -7，如果向负无穷取整，得到的结果就是 3。

到底是向 0 取整还是向负无穷取整，不同的语言实现方式不同，通常默认是按照向 0 取整来计算的，Python 是按照向负无穷取整来计算的，部分语言干脆提供两个函数，rem 和 mod。

有时候确实需要使用向负无穷取整这种方式怎么办呢。可以通过 floor 函数来计算，该函数是向下取整。那么取模变为如下方式:

Copy
r = a - floor(a / b) * b

参考

负数取模怎么算

带符号整数的除法与余数

为什么负数的取余计算各个编程语言结果不统一

取模运算