您的位置:首页 > 编程语言 > Python开发

python3之数字(在实际应用中的数字--除法:传统除法、Floor除法和真除法)

2011-11-14 19:46 369 查看
python3之数字(在实际应用中的数字--除法:传统除法、Floor除法和真除法)

----------

除法在python3.0和python2.6中略有差异,实际上,有3种类型的除法,有两种不同的除法操作符,其中一种操作符在python3.0中变化:

X/Y :
传统除法和真除法。在python2.6或之前的版本中,这个操作符对于整数会省去小数部分,对于浮点数会保持小数部分。在python3.0版本中将会变成真除法(无论任何类型都会保持小数部分)。

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

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

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

2.在python2.6中,/ 表示传统除法,如果两个操作数都是整数的话,执行截断的整数除法(好像是Floor除法????);否则,执行浮点除法(保留余数,好像是真除法?)。// 执行Floor除法,并且像在python3.0中一样工作,对于整数执行截断除法,对于浮点数执行浮点除法。

如例,在python3.0中:

>>>10/4
2.5
>>>10//4
2
>>>10/4.0
2.5
>>>10//4.0
2.0
在python2.6中:

>>>10/4
2
>>>10//4
2
>>>10/4.0
2.5
>>>10//4.0
2.0
注意,在python3.0中,//的结果的数据类型总是依赖于操作数的类型:如果操作数中有一个是浮点数,结果就是浮点数;否则,结果是一个整数。尽管这可能与python2.x中类型依赖行为类似(正是该因素引发了在python3.0中的变化),但返回值类型的差异比返回值本身的差异要轻微很多。

支持两个python版本

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

X = Y // Z
X = Y / float(Z)
作为替代方法,我们可以使用一个__future__ import在python2.6中打开python3.0的/,而不是用浮点转换来强制它:

>>>from __future__ import division
>>>10/4
2.5
>>>10//4
2


Floor除法 VS 截断除法

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

>>>import math
>>>math.floor(2.5)
2
>>>math.floor(-2.5)
-3
>>>math.trunc(2.5)
2
>>>math.trunc(-2.5)
-2
在执行除法操作的时候,只是真正截断了正的结果,因此截断除法和floor除法是相同的;对于负数,它就是一个floor结果(实际上,它们都是floor,但是对于正数来说,floor和截断是相同的)。下面是在python3.0中的情况:

>>>5/2,5/-2
(2.5,-2.5)
>>>5//2,5//-2
(2,-3)
>>>5/2.0,5/-2.0
(2.5,-2.5)
>>>5//2.0,5//-2.0
(2.0,-3.0)
python2.6中的例子:

>>>5/2,5/-2
(2,-3)
>>>5//2,5//-2
(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版本,python3.0中,如例:

>>>import math
>>>5/-2
-2.5
>>>5//-2
-3
>>>math.trunc(5/-2)
-2
python2.6中例子:

>>>import math
>>>5/float(-2)
-2.5
>>>5/-2,5//-2
(-3,-3)
>>>math.trunc(5/float(-2))
-2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: