返回介绍

除法:传统除法、Floor 除法和真除法

发布于 2024-01-29 22:24:17 字数 2963 浏览 0 评论 0 收藏 0

之前部分已经介绍了除法的工作方式,你应该知道其行为在Python 3.0和Python 2.6中略有差异,实际上,有3种类型的除法,有两种不同的除法操作符,其中一种操作符在Python 3.0中有了变化:

X/Y

传统除法和真除法。在Python 2.6或之前的版本中,这个操作对于整数会省去小数部分,对于浮点数会保持小数部分。在Python 3.0版本中将会变成真除法(无论任何类型都会保持小数部分)。

X//Y

Floor除法。在Python 2.2中新增的操作,在Python2.6和Python3.0中均能使用。这个操作不考虑操作对象的类型,总会省略掉结果的小数部分,剩下最小的能整除的整数部分。

添加真除法是为了解决最初的传统除法的结果依赖于操作数类型(因此,其结果在Python这样的动态类型语言中很难预料)这一现象。由于这一限制,Python 3.0取消了传统除法:/和//操作符在Python 3.0中分别实现真除法和Floor除法。

概括来讲:

·在Python 3.0中,/现在总是执行真除法,不管操作数的类型,都返回包含任何余数的一个浮点结果。//执行Floor除法,它截除掉余数并且针对整数操作数返回一个整数,如果有任何一个操作数是浮点类型,则返回一个浮点数。

·在Python 2.6中,/表示传统除法,如果两个操作数都是整数的话,执行截断的整数除法;否则,执行浮点除法(保留余数)。//执行Floor除法,并且像在Python 3.0中一样工作,对于整数执行截断除法,对于浮点数执行浮点除法。

下面是两个操作符在Python 3.0和Python 2.6中的用法:

注意,在Python 3.0中,//的结果的数据类型总是依赖于操作数的类型:如果操作数中有一个是浮点数,结果就是浮点数;否则,结果是一个整数。尽管这可能与Python 2.X中类型依赖行为类似(正是该因素引发了在Python 3.0中的变化),但返回值类型的差异比返回值本身的差异要轻微很多。此外,对于依赖截断整数除法的程序(这种程序可能比你所意识到的要更为常见),//作为向后兼容工具的一部分而提供,对于整数类型,它必须返回整数。

支持两个Python版本

尽管/的行为在Python 2.6和Python 3.0中不同,我们仍然能够在自己的代码中支持这两个版本。如果你的程序依赖于截断整数除法,在Python 2.6和Python 3.0中都使用//。如果你的程序对于整数需要带有余数的浮点数结果,使用浮点数,从而确保代码在Python 2.6中运行的时候/的一个操作数是浮点数:

作为替代方法,我们可以使用一个__future__import在Python 2.6中打开Python 3.0的/,而不是用浮点转换来强制它:

Floor除法VS截断除法

一个细微之处在于://操作符通常叫做截断除法,但是,更准确的说法是floor除法,它把结果向下截断到它的下层,即真正结果之下的最近的整数。其直接效果是向下舍入,并不是严格地截断,并且这对负数也有效。你可以使用Python的math模块来自己查看其中的区别(在使用模块中的内容之前,必须先导入模块;随后将更详细地介绍这些内容):

在执行除法操作的时候,只是真正地截断了正的结果,因此截断除法和floor除法是相同的;对于负数,它就是一个floor结果(实际上,它们都是floor,但是对于正数来说,floor和截断是相同的)。下面是在Python 3.0中的情况:

Python 2.6中的情况类似,但是/的结果再次有所不同:

如果你真的想要截断而不管符号,可以总是通过math.trunc来得到一个浮点除法结果,而不管是什么Python版本(请查看内置的round函数以了解相关的功能):

为什么截断很重要

如果使用Python 3.0,这里有一个关于除法操作符的简短故事:

对于Python 2.6的用户,除法像下面这样工作:

尽管还是得出来了结果,但是,Python 3.0中/的非截断行为还是可能会影响到大量的程序。可能是因为C语言的遗留原因,很多程序员依赖于整数的截断除法,因此他们必须学习在这样的环境中使用//。查看第13章中的一个简单的素数while循环的示例,以及第四部分末尾的一个相应的练习,它们说明这一/修改可能会影响到的代码的种类。还要更多地关注本小节中的特殊的from命令,第24章将更深入地讨论它。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文