考虑一下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特定问题。
考虑一下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特定问题。
4条答案
按热度按时间cgyqldqp1#
看一看PEP-238:更改除法运算符
//操作符可以明确地请求楼层划分。
6l7fqoea2#
哎呀,马上就找到了
2//2
。这将输出一个int而不是float。o8x7eapl3#
Python 2.7和Python 3中除法运算符的行为
在Python 2.7中:默认情况下,除法运算符将返回整数输出。
要获得双精度结果,请将被除数或除数乘以1.0。
在Python 3中
ekqde3dh4#
公认的答案已经提到了PEP 238,我只想为那些对正在发生的事情感兴趣的人添加一个快速的幕后浏览,而不必阅读整个PEP。
Python将
+
、-
、*
和/
等运算符Map到特殊函数,例如a + b
等价于关于Python 2中的除法,默认情况下只有
/
Map到__div__
,并且结果依赖于输入类型(例如int
,float
)。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中使用相同的代码,请使用
并坚持使用PEP 238中的
/
和//
语义。