Python整数除法产生浮点数


223
Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

这是故意的吗?我强烈记得以前的版本返回了int/int=int吗?我该怎么办,有没有新的分公司运营商,或者我必须始终选拔?


31
是的,这就是3.x中除法的工作方式。
hughdbrown

2
这里有一个职位由Python的创建者谈到如何四舍五入的作品,它是垂直于你的问题,但我觉得它很有趣:python-history.blogspot.com/2010/08/...
亚伦d

@hughdbrown,这实际上意味着所有 python 3版本都适用吗?
查理·帕克

@hughdbrown:是的,PEPfinal,表示既被接受又被实施。
乔纳斯·比斯特罗姆

Answers:


285

看看PEP-238:更改除法运算符

//运算符将可用于明确要求楼层分割。


10
@JonathanSternberg,除了为python 2.0编写的所有代码。我觉得/和//的角色应该互换,以保持向后兼容性。同样,几乎所有其他语言/保留类型。我想让// //自动转换为float而不是/更有意义。
thang

1
第二部分(在“ Also”之后)很有意义(与其他语言类似),但是对于第一部分,Python 3 的全部重点是不向后兼容Python 2,而是解决了Python的一系列问题2.足够多的人发现/需要在Python 3中解决的语言设计“错误”足够多的歧义。这可能是一个有争议的决定,但是足够多的人认为这是正确的决定。在喜欢变革的团队中算我。很好,我们都同意不同意。干杯。:)
雷·托尔

59

糟糕,立即发现2//2


5
你能详细说明吗?
blueFast

4
使用此方法将输出一个int,而不是float @dangonfast。
Ashish Ahuja '18

这似乎不适用于负数。-1 // 5返回-1,而-5 // 5返回-1。
mschuett

@mschuett:这是可以预期的,并且是相同的结果与Python 2
纳斯Byström

1
是的,我做了一些进一步的挖掘,并发现了这一点。但是我可以想象,相当多的人可能不会意识到这一点,这取决于他们来自的语言。
mschuett

45

希望它可以立即帮助某人。

Python 2.7和Python 3中除法运算符的行为

在Python 2.7中:默认情况下,除法运算符将返回整数输出。

将结果以1.0的两倍倍数除以 “除数或除数”

100/35 => 2 #(Expected is 2.857142857142857)
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857

在Python 3中

// => used for integer output
/ => used for double output

100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0    # floating-point result if divsor or dividend real

1
顺便说一句,无需乘以1.0。其中一个数字是浮点数就足够了。例如,100 / 35.0 = 100.0 / 35 = 2.857142857142857
Tal J. Levy

21

接受的答案已经提到了PEP 238。我只想为那些对正在发生的事情感兴趣的人快速了解幕后情况,而无需阅读整个PEP。

Python将运算符+-,,*和)映射/到特殊函数,例如a + b相当于

a.__add__(b)

关于在Python 2分割,存在通过仅仅默认/映射到__div__,其结果是依赖于输入类型(例如intfloat)。

Python 2.2引入了__future__功能division,该功能通过以下方式更改了分割语义(PEP 238的TL; DR):

  • /__truediv__必须“返回除法的数学结果的合理近似值”的映射(来自PEP 238的引用)
  • //映射到__floordiv__,应返回的底数结果/

在Python 3.0中,PEP 238的更改成为默认行为,并且__div__Python对象模型中没有其他特殊方法。

如果要在Python 2和Python 3中使用相同的代码,请使用

from __future__ import division

并坚持到PEP的238个语义///


0

根据Python3文档,python除以整数后,尽管预期为整数,但仍会生成浮点数。

对于仅打印整数,请使用floor division method。楼层除法将四舍五入并除去小数点。Represented by //

因此,使用2/2代替 2//2

__future__无论使用python2还是python3,也可以从中导入除法。

希望能帮助到你!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.