python-3.x 为什么整数除法会产生浮点数而不是另一个整数?

1l5u6lss  于 2022-12-24  发布在  Python
关注(0)|答案(4)|浏览(184)

考虑一下Python 3中的这种划分:

>>> 2/2
1.0

这是故意的吗?我强烈地记得早期版本返回int/int = int。我应该怎么做?是有一个新的除法运算符还是我必须总是强制转换?
在2.x中,这种行为实际上是相反的;请参见How can I force division to be floating point? Division keeps rounding down to 0?以了解相反的2.x特定问题。

cgyqldqp

cgyqldqp1#

看一看PEP-238:更改除法运算符
//操作符可以明确地请求楼层划分。

6l7fqoea

6l7fqoea2#

哎呀,马上就找到了2//2。这将输出一个int而不是float。

o8x7eapl

o8x7eapl3#

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
ekqde3dh

ekqde3dh4#

公认的答案已经提到了PEP 238,我只想为那些对正在发生的事情感兴趣的人添加一个快速的幕后浏览,而不必阅读整个PEP。
Python将+-*/等运算符Map到特殊函数,例如a + b等价于

a.__add__(b)

关于Python 2中的除法,默认情况下只有/Map到__div__,并且结果依赖于输入类型(例如intfloat)。
Python 2.2引入了__future__特性division,它以如下方式改变了除法语义(TL; PEP 238的DR):

  • /Map到__truediv____truediv__必须“返回除法的数学结果的合理近似值”(引自PEP 238)
  • //Map到__floordiv__,后者应返回/的floor结果

在Python 3.0中,PEP 238的变化变成了默认行为,并且在Python的对象模型中不再有特殊的方法__div__
如果要在Python 2和Python 3中使用相同的代码,请使用

from __future__ import division

并坚持使用PEP 238中的///语义。

相关问题