除法运算 & 取模运算(Python3 vs C)

除法运算 \

C
1
2
3
4
printf("%d\n", 4 / 3);    // 1
printf("%d\n", 4 / (-3)); // -1
printf("%d\n", (-4) / 3); // -1
printf("%d\n", (-5) / 3); // -1

符号正常,将小数部分舍去,结果为整数

Python3
1
2
3
4
print(4 / 3);    #  1.3333333333333333
print(4 / (-3)); # -1.3333333333333333
print((-4) / 3); # -1.3333333333333333
print((-5) / 3); # -1.6666666666666667

符号正常,且小数部分保留(有精度限制)

取模运算 %

% 只能用于整型

以 a % b 为例,计算步骤一般为:

  1. 算出 c = a / b

  2. res = a - (b * c)

C
1
2
3
4
printf("%d\n", 4 % 3);    // 4 / 3    = 1,   res = 4 - (3 * 1)       = 1
printf("%d\n", 4 % (-3)); // 4 / (-3) = -1, res = 4 - ((-3) * (-1)) = 1
printf("%d\n", (-4) % 3); // (-4) / 3 = -1, res = -4 - (3 * (-1)) = -1
printf("%d\n", (-5) % 3); // (-5) / 3 = -1, res = -5 - (3 * (-1)) = -2
Python3
1
2
3
4
5
print(4 % 3);    # 4 / 3    =  1.3333333333333333 => 1,   res = 4 - (3 * 1)       = 1
print(4 % (-3)); # 4 / (-3) = -1.3333333333333333 => -2, res = 4 - ((-3) * (-2)) = -2
print((-4) % 3); # (-4) / 3 = -1.3333333333333333 => -2, res = -4 - (3 * (-2)) = 2
print((-5) % 3); # (-5) / 3 = -1.6666666666666667 => -2, res = -5 - (3 * (-2)) = 1
print((-7) % 3); # (-7) / 3 = -2.3333333333333335 => -3, res = -7 - (3 * (-3)) = 2
小结
  • C : 在第 1 步算 c = a / b 时,舍去小数部分(即:向0方向取整)

  • Python : 在第 1 步算 c = a / b 时,向无穷小方向取整


  • 由于想到在 Python 中,mod 函数的第 1 步采用 floor 函数,而 rem 函数的第 1 步采用 fix 函数

所以可以说 Python 中的%是取模,而 C 中的%是取余

差别就在第 1 步的处理方式上是用的fix还是floor

又多比较了几种编程语言

C、Node.js、Java 第 1 步都是 fix,%可称为取余运算

唯独 Python 第 1 步是 floor,%可称为取模运算

mo

关于取模运算的更多信息请参考这里

(完)