为什么整数除法产生一个浮点数而不是另一个整数?

考虑Python中的这种划分:

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。我该怎么办?是否有新的除法运算符或者我必须一直施法?


在2。X,行为确实是相反的;见我怎么能强制除法是浮点数?除法一直四舍五入到0?为相反,2。x-specific问题。

214637 次浏览

哎呀,立即找到2//2。这将输出一个int型而不是浮点型。

看一下pep - 238:改变除法运算符

//操作员可以明确要求楼层划分。

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

Python将诸如+-*/等操作符映射到特殊函数,例如a + b等价于

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中使用相同的代码,请使用

from __future__ import division

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

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 the divisor or dividend is real