本系列文章译自Python之父 Guido van Rossum 的系列博客“The History of Python”。这个博客系列对我们理解Python及其演变很有帮助,经Guido同意,在这里翻译推荐给大家,希望大家喜欢,也请大家多多指教!

系列地址:http://blog.kantli.com/theme/1

1

今天又有人问我,为什么 Python 中整数相除是向下取整,而不像 C语言一样靠 0 取整?

对正整数来说,两种取整方式的结果是一样的:

>>> 5//22

如果其中一个是负数,结果就不是向零靠近了(而向负无穷靠近):

>>> -5/2-3>>> 5//-2-3

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

# a/b = q 余 r

'# b*q + r = a,其中 0 <= r < b

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

数学家们总是倾向于后一种选择。(参考维基百科https://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4)

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

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

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

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


2

那么,C语言为什么采用了向零取整呢?或许是因为当时的硬件设计——在最早期的硬件中,负数的表现方式是“符号 + 数字”,而不是现在一般采用的补码(至少整数是如此)。

我用的第一台电脑是一台 CDC 主机,其整数和浮点数都是用补码表示的,60 个 1 表示的是负 0。

Tim Peters 曾担心我会把这个原则扩展到浮点数。他或许是对的,当 x 是一个非常小的负数时,向下取整原则会导致 x % 1.0 出现精度损失。但这个问题并不影响我让整数采取向下取整原则。


PS. 请注意,我用的符号是 // 而不是 /,这是 Python 3 中的句法,在 Python 2 中也可以使用,表示用户明确使用整除而不是除号。Python 2 中的 / 操作可能会有歧义,因为当两个参数都是整数时,它只返回整数,而当存在浮点数参数时,则返回浮点数。不过这是另一个故事了,可以参考 PEP 238。

公众号:ReadingPython

向下取整符号_22. 为什么 Python 中的整除是向下取整?相关推荐

  1. python取反操作_在python中对于bool布尔值的取反操作

    背景 根据公司业务的需求,需要做一个对于mysql数据库的大批量更新.脚本嘛也是干干单单.使用了redis的队列做缓存,可以异步并发的多任务进行更新. 有点难受的地方在于,请求访问时,因为一些网速,速 ...

  2. Python中对象名称前单下划线和双下划线有啥区别

    单下划线 在一个类中的方法或属性用单下划线开头就是告诉别的程序这个属性或方法是私有的.然而对于这个名字来说并没有什么特别的. 引自PEP-8: 单下划线:"内部使用"的弱指示器.比 ...

  3. python整数转换字符串_使用Python中的str()函数将整数值转换为字符串

    python整数转换字符串 Given an integer value and we have to convert the value to the string using str() func ...

  4. python os模块安装方法_基于python中pygame模块的Linux下安装过程(详解)

    一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...

  5. ubuntu下安装caffe时,在python中import caffe报错。

    @[TOC]ubuntu下安装caffe时,在python中import caffe报错. 编译完caffe无报错后,按照~/caffe/python/requirement.txt中的要求安装好所有 ...

  6. python中pygame模块下载_基于python中pygame模块的Linux下安装过程(详解)

    pyhthon中pygame模块怎么安装?pyhthon中pygame模块怎么安装?鄙人为初二一名学生,闲来无事 钻研起电这句话还是建议问一下你们代课老师吧,因为你们老师是这方面专家,诺儿那边的话肯定 ...

  7. python中取整函数_如何使用python中的取整floor函数?

    如果一工程通过公式计算得出需要7.1辆汽车,直接取整成7辆肯定是完不成任务的,所以只有向上舍入成8才可以,即取整成7,再加1.取整加1,就是向上舍入成整数.相反,如果取整减1,那就是向下舍入成整数,即 ...

  8. python中try怎么用_python下try

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 就需要捕获错误类型了语法如下:try: # 尝试执行的代码 passexcept ...

  9. python取列表中位数_在Python中查找列表的中位数

    Python 3.4有statistics.median : 返回数字数据的中位数(中间值). 当数据点数为奇数时,返回中间数据点. 当数据点的数量是偶数时,通过取两个中间值的平均值来插值中值: &g ...

最新文章

  1. Extjs:添加查看全部按钮
  2. “偷鸡”不成的马斯克,终于丢掉了自己的“王位”
  3. python读取文件名存到list_python读取文件名称生成list的方法
  4. 第十六届全国大学生智能车竞赛线上比赛(广东+西南科技大学)成绩排名与获奖信息
  5. 解决通过vue-router打开tab页,下次进入还是上次history缓存的界面状态的问题
  6. LVS三种工作模式介绍对比和十种调度算法介绍
  7. MySQL删除表数据
  8. C++--day05
  9. 三、Vue组件化开发学习笔记——组件化的基本步骤、全局组件和局部组件、父组件和子组件、注册组件的语法糖、模板分离写法、组件的数据存放
  10. float php 运算_系统的讲解 - PHP 浮点数高精度运算
  11. (49)System Verilog 类中数组长度约束
  12. 【amtlib.dll文件下载】amtlib.dll怎么替换
  13. 在Ubuntu Kylin 优麒麟系统中安装 Etcher镜像烧录软件
  14. Dubbo错误No provider available for the service
  15. php.exe不是 32位有效应用程序,XP系统打开程序时提示“不是有效的Win32应用程序”怎么办?...
  16. 图片合成器,一键将目录中多个文件夹的图片转换为PDF
  17. 【Photoshop抠图技巧】PS新手必备,七种高效好用的方法
  18. Mac 和 iPad 产品线要合并?苹果高管回应了
  19. java登陆密码加密怎么做,Java如何实现密码加密
  20. 智能硬件产品系列 之 MTK6580方案篇(一)硬件选型

热门文章

  1. 9.1-9.4 因特网与网络互连技术(上)
  2. 计算机专业职业生涯规划书,计算机信息专业职业生涯规划书
  3. Java项目开发:学生社团管理系统
  4. 描边时消除锯齿SetSmoothingMode
  5. 【转载】tcpdump的移植和使用方法
  6. 数据结构题(C语言)----括弧匹配检验(check)
  7. spark while_while循环怎么理解
  8. 记2015沈阳区域赛
  9. 将Dos文档格式转换为Unix格式
  10. 参会指南 · 2018中国软件生态大会西安站