目录

为什么Python中的整除是向下取整

这个问题让一些人感到困扰,但其实是有数学考虑的。整除操作(//)与取模操作(%)是一个组合,共同实现一个数学关系(所有变量都是整数):# a/b = q 余 r# b*q + r = a,其中 0 <= r < b。

一、为什么Python中的整除是向下取整

这个问题让一些人感到困扰,但其实是有数学考虑的。整除操作(//)与取模操作(%)是一个组合,共同实现一个数学关系(所有变量都是整数):

# a/b = q 余 r# b*q + r = a,其中 0 <= r < b。

当 a 为负数(b 保持正数),我们有两个选择:一个是让 q 向零取整,于是余数 r 会变成负数,即 0 <= abs(r) < b;另一个是让 q 向负无穷取整,则余数的设定保持不变。

数学家们总是倾向于后一种选择。

而在 Python 中,我也选择了后一种方案,因为在实际应用中,存在一些 a 既可能为正数也可能为负数的情况。

以 POSIX 时间戳(1970年以来的秒数)为例,如果我们要获取当前的具体时间,由于每天为 24 * 3600 = 86400 秒,只需直接取模 t % 86400 就可以了。假如时间戳为负数,即在 1970 年之前,那么,为获得正确结果,就只能用向下取整,而不是向零取整。

我能想到的另一个例子是图像点位的计算。而且我很确定,还有许多其它例子。

顺便提一下,如果 b 取负数,整个等式就反过来了:0 >= r > b。

延伸阅读:

二、Python中取整的几种方法小结

1、向下取整

向下取整直接用内建的 int() 函数即可:

>>> a = 3.75

>>> int(a)

2、四舍五入

对数字进行四舍五入用 round() 函数:

>>> round(3.25); round(4.85)

3.0

5.0

3、向上取整

向上取整需要用到 math 模块中的 ceil() 方法:

>>> import math

>>> math.ceil(3.25)

4.0

>>> math.ceil(3.75)

4.0

>>> math.ceil(4.85)

5.0

4、分别取整数部分和小数部分

有时候我们可能需要分别获取整数部分和小数部分,这时可以用 math 模块中的 modf() 方法,该方法返回一个包含小数部分和整数部分的元组:

>>> import math

>>> math.modf(3.25)

(0.25, 3.0)

>>> math.modf(3.75)

(0.75, 3.0)

>>> math.modf(4.2)

(0.20000000000000018, 4.0)

有人可能会对最后一个输出结果感到诧异,按理说它应该返回 (0.2, 4.0) 才对。这里涉及到了另一个问题,即浮点数在计算机中的表示,在计算机中是无法精确的表示小数的,至少目前的计算机做不到这一点。上例中最后的输出结果只是 0.2 在计算中的近似表示。Python 和 C 一样, 采用 IEEE 754 规范来存储浮点数。