Python整数除法产生浮点数

Jon*_*röm 211 python integer division python-3.x

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
Run Code Online (Sandbox Code Playgroud)

这是有意的吗?我强烈记得早期版本的回归int/int=int?我应该怎么做,是否有新的分区运算符或者我必须总是演员?

Bra*_*lor 268

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

//运营商可以明确地请求楼层划分.

  • @JonathanSternberg除了为python 2.0编写的所有代码.我觉得应该颠倒/和//的角色以保持向后兼容性.此外,几乎所有其他语言/保留类型.我会更有意义的是//自动转换为float,而不是/. (9认同)
  • 第二部分(在“Also”之后)是有道理的(与其他语言相似),但关于第一部分,Python 3 的整个要点是不向后兼容 Python 2,而是修复 Python 的一堆问题2.足够多的人发现 `/` 的歧义足以构成一种语言设计“错误”,需要在 Python 3 中修复。这可能是一个有争议的决定,但足够多的人认为这是正确的。把我算在热爱改变的群体中吧。很高兴我们都能同意不同意。干杯。:) (2认同)

Jon*_*röm 54

哎呀,马上找到了2//2.

  • 你能详细说说吗? (5认同)
  • 使用它将输出一个int,而不是一个浮点@dangonfast. (4认同)
  • 如果两个除数都是整数,则“//”仅产生一个整数。 (2认同)

小智 41

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

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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

  • `//` 不是“用于整数输出”。`//` 是 `floor()` 函数除法的结果,如果两个操作数是整数,则生成一个整数;如果其中至少一个是浮点数,则生成一个浮点数,以实现类型一致性。 (3认同)
  • 顺便说一句,不需要乘以1.0。其中一个数字是浮点数就足够了。例如,100/35.0 = 100.0/35 = 2.857142857142857 (2认同)

cod*_*kel 21

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

Python的地图运营商如+,-,*/特殊的功能,使得例如a + b相当于

a.__add__(b)
Run Code Online (Sandbox Code Playgroud)

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

Python 2.2引入了该__future__功能division,它以下列方式改变了划分语义(TL; PEP 238的DR):

  • /__truediv__必须"返回划分数学结果的合理近似值"的地图(引自PEP 238)
  • //映射到__floordiv__,应返回地板的结果/

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

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

from __future__ import division
Run Code Online (Sandbox Code Playgroud)

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