首先考慮函數:
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)