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

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

    原文作者:fhd001
    原文地址: https://blog.csdn.net/fhd001/article/details/6969864
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞