数字类型实战——除法:经典的、取整的、真正的——向下取整 vs 截断

未匹配的标注

一个细微差别://操作符被不正式地被称为截断除法,但将其称为向下取整除法更准确——它将结果向下截断到它的“底部”,意味着比真正的除法结果小的最大整数。最终效果是向下四舍五入,不是严格地截断,而且这对负数很重要。可以用Python的math模块来查看差异(在能使用模块内容前必须先导入,后面会详述):

>>> import math
>>> math.floor(2.5) # 在真正的除法值下的最接近的数字
2
>>> math.floor(-2.5)
-3
>>> math.trunc(2.5) # 截断小数部分(朝着零)
2
>>> math.trunc(-2.5)
-2

当运行除法操作符时,对正数结果真的只是截断,因为截断和向下取整相同;但对负数而言,它是向下取整结果(真的,它们都是向下取整,但对正数来说,向下取整和截断相同)。下面是系列3中的情形:

C:\code> c:\python33\python
>>> 5 / 2, 5 / −2
(2.5, −2.5)
>>> 5 // 2, 5 // −2 # 截断到"floor":四舍五入到比真正除法结果的第一个更小的整数
(2, −3) # 2.5 变成 2, −2.5 变成 −3
>>> 5 / 2.0, 5 / −2.0
(2.5, −2.5)
>>> 5 // 2.0, 5 // −2.0 # 对浮点数同理,虽然结果也是浮点数
(2.0, −3.0)

系列2的情形也类似,但/结果再次不同:

C:code> c:\python27\python
>>> 5 / 2, 5 / −2 # 在系列3中不同
(2, −3)
>>> 5 // 2, 5 // −2 # 这句和后面的在系列2和系列3中都相同。
(2, −3)
>>> 5 / 2.0, 5 / −2.0
(2.5, −2.5)
>>> 5 // 2.0, 5 // −2.0
(2.0, −3.0)

如果真的想不管正负号而朝着零截断,总是可以通过math.trunc来执行浮点除法结果,不用管Python版本(也可以参考round内置函数获取相关的功能,还有int内置函数,它在这里效果一样,但不需要导入):

C:\code> c:\python33\python
>>> import math
>>> 5 / −2 # 保留余数
−2.5
>>> 5 // −2 # 真正除法的结果下面的取整
-3
>>> math.trunc(5 / −2) # 截断而非向下取整 (和 int() 一样)
−2
C:\code> c:\python27\python
>>> import math
>>> 5 / float(−2) # 系列2中的余数
−2.5
>>> 5 / −2, 5 // −2 # 系列2中的向下取整
(−3, −3)
>>> math.trunc(5 / float(−2)) # 系列2中的截断
−2

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~