CC++ & Algorithm

你以为你会了加减乘除?Python算术运算符的坑与妙用

刚学Python那会儿,我自认为算数基础扎实,加减乘除谁不会啊?结果写了个财务计算脚本,发现 7/3 给我整出个 2.3333333333333335,当时就懵了。后来排查半天,原来是对除法的浮点数精度和整数除法 // 理解不够。从那以后,我意识到这些看似简单的运算符,背后藏着不少编程特有的逻辑——它们不是数学课上的计算器,而是有自己“脾气”的工具。

四则运算:你以为的只是表象

Python里的 +-*/ 和数学几乎一样,但有两个关键区别:

  1. 除法永远返回浮点数8 / 2 结果是 4.0 而不是 4,这在做整数索引或循环时会踩坑。
  2. // 是地板除,不是简单的“取整”7 // 32,因为向下取整(往负无穷方向)。负数时尤其要注意:-7 // 3 结果是 -3,而不是 -2,因为 -7/3≈-2.333 向下取整是 -3

取余 % 也遵循同样的规律:-7 % 3 结果是 2(因为 -7 = 3 * (-3) + 2),这和许多语言的实现一致,但数学直觉常常是 -1

幂运算 ** 则很直观,2 ** 3 就是 8,也能用于分数指数:9 ** 0.5 得到 3.0

题目里的小陷阱:别被“简单”骗了

来看看第一个题目:挖胡萝卜。小兔挖了 x 个,狐狸是它的3倍,小羊比狐狸少8个。要求输出狐狸数量、小羊数量、以及三个动物的平均数(保留1位小数)。

这道题的核心是顺序运算:先算狐狸 3 * x,再算小羊 3 * x - 8。平均数是三个数的和除以3,注意除法结果可能是浮点数,保留1位小数可以用格式化字符串。

x = int(input())
fox = 3 * x
sheep = 3 * x - 8
avg = (x + fox + sheep) / 3
print(fox)
print(sheep)
print(f"{avg:.1f}")

考察点很清晰:乘法和减法的组合、除法的浮点特性、格式化输出。如果你直接 print(x + fox + sheep // 3) 就错了——// 会截断小数,而题目要求保留1位。

第二个题目:请假时间计算。n 天,求小时数和分钟数。小时数 = n * 24,分钟数 = n * 24 * 60 = n * 1440。这里用乘法即可,注意输入是整数,输出也是整数,直接用 * 不会出错。

但仔细想想:如果 n 很大(比如 1000 天),Python 的整数是任意精度的,不用担心溢出。这种题目虽然简单,却提醒我们:运算符本身没问题,但输入范围和输出类型要提前确认

再看两个选择题:

  • print(10 // 3) 输出什么?答案是 3。如果写成 print(10 / 3) 结果是 3.3333333333333335// 是地板除,所以是 3
  • 2 ** 3 结果是 8。这题太直接,但幂运算的优先级高于其他算术运算符(除了一元负号),写 -2 ** 3 结果是 -8 而不是 (-2)**3-8,这里没有括号,优先级规则需要留意。

深入一点:运算符的“隐藏技能”

除了基本用法,几个小技巧值得记住:

  • % 判断奇偶num % 2 == 0 是偶数,== 1 是奇数。负数时小心,-3 % 21,所以判断奇偶用 num % 2 != 0 更安全。
  • // 做整除和截断:比如把秒数转换成分钟:total_minutes = seconds // 60,余数用 % 取。
  • ** 快速计算平方、立方n ** 0.5 是平方根,n ** (1/3) 是立方根。
  • 混合运算的优先级** > * / // % > + -,和数学一致。加括号永远是最保险的。

我曾经犯过一个错:写 2 ** 3 ** 2 以为是 (2**3)**2=64,结果 Python 里幂运算是右结合,实际是 2**(3**2)=2**9=512。这种细节只有被坑过才会记住。

写在最后

算术运算符是编程的“基本功”,但基本功恰恰最容易出岔子。我的建议是:每个运算符都亲手试试边界情况——负数、0、大数、浮点混合。心里有数,写代码才不会翻车。

进阶可以学习 divmod() 函数(同时返回商和余数)、round() 的银行家舍入规则,还有位运算中的 <<>> 其实可以替代部分乘除(x << 1 等价于 x * 2,但整数运算更快)。不过这是后话了——先把加减乘除玩明白,比什么都强。

这篇文章对你有帮助吗?

有用 100%没用 0%

想系统学习这个知识点?查看完整知识点 →