首先考虑函数:
floor(x) 向下取整
ceil(x) 向上取整
round(x) 四舍五入到最近的整数
fix(x) 向零取整
通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算。
在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的。
对于整型数a,b来说,取模运算或者求余运算的方法都是:
1.求整数商: c = a / b
2.计算模或者数: r = a - c * b
求模运算和求余运算在第一步不同:
求余运算在取c的值时,向0方向舍入(fix()函数);
取模运算在计算c的值时,向负无穷大方向舍入(floor()函数).
样例:
a | b | C语言:a%b (求余) | Python Shell: a%b(取模) |
-3 | -5 | -3 | -3 |
-3 | 4 | -3 | 1 |
-3 | 2 | -1 | 1 |
-1 | 6 | -1 | 5 |
-4 | -3 | -1 | -1 |
2 | 4 | 2 | 2 |
5 | 3 | 2 | 2 |
4 | -7 | 4 | -3 |
4 | -3 | 1 | -2 |
-6 | -5 | -1 | -1 |
可以看出,如果想将求余运算转换为取模运算,如此转换:
mod(a,b) = rem ( rem(a,b) + b , b )
证明:
由于rem(a,b) = a - b * fix(a/b)
则rem ( rem(a,b) + b , b ) = ( rem(a,b) + b ) - b * fix( (rem(a,b) + b) / b )
= a - b * fix(a/b) + b - b * fix( ( a - b * fix(a/b) + b ) / b )
= a - b * fix(a/b) + b - b * fix( a/b - fix(a/b) + 1 )
当a/b >= 0时: = a - b * fix(a/b) = a - b * floor(a/b)
当a/b < 0时: = a - b * fix(a/b) + b = a - b * ( fix(a/b) - 1 ) = a - b * floor(a/b)