Python整数除法产生浮点数

Python integer division yields float

1
2
3
4
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? 我该怎么办,是否有一个新的分区运算符或者我必须总是演员?


请看PEP-238:更改分部操作员

The // operator will be available to request floor division unambiguously.


哎呀,马上找到2//2


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

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

In Python 2.7: By default, division operator will return integer output.

将结果以双倍倍数1.0获得"除数或除数"

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

In Python 3

1
2
3
4
5
6
// => 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


已经接受的答案已经提到了PEP 238.我只是想在没有阅读整个PEP的情况下为那些对正在发生的事情感兴趣的人添加一个快速的视角。

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

1
a.__add__(b)

关于Python 2中的除法,默认情况下只有/映射到__div__,结果取决于输入类型(例如intfloat)。

Python 2.2引入了__future__特性division,它以下列方式改变了除法语义(TL; PEP 238的DR):

  • /映射到__truediv__,必须"返回合理的近似值
    分裂的数学结果"(引自PEP 238)
  • //映射到__floordiv__,它应返回/的覆盖结果

使用Python 3.0,PEP 238的更改成为默认行为,Python的对象模型中没有更多特殊方法__div__

如果你想在Python 2和Python 3中使用相同的代码

1
from __future__ import division

并坚持///的PEP 238语义。