考虑在Python 3中进行的这个除法:
>>> 2/2
1.0
这是有意的吗?我非常记得早期版本返回 int/int = int
。我该怎么办?是否有一个新的除法运算符或者我必须总是转换类型?
在2.x版本中,行为确实被颠倒了;请参阅如何强制执行浮点数除法?除法始终向下舍入到0? 以获取相反的、特定于2.x的问题。
考虑在Python 3中进行的这个除法:
>>> 2/2
1.0
这是有意的吗?我非常记得早期版本返回 int/int = int
。我该怎么办?是否有一个新的除法运算符或者我必须总是转换类型?
在2.x版本中,行为确实被颠倒了;请参阅如何强制执行浮点数除法?除法始终向下舍入到0? 以获取相反的、特定于2.x的问题。
请参阅PEP-238:更改除法运算符
//运算符可用于请求取整除,以避免歧义。
糟糕,立即发现2//2
。这将输出一个整数而不是一个浮点数。
//
而不是/
,导致依赖于浮点数的代码出现问题,而没有意识到其影响。 - TylerH//
运算符仅返回整数。 - eric在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
+
、-
、*
和/
这样的运算符映射到特殊函数,因此例如a + b
等价于a.__add__(b)
/
,它映射到__div__
,结果取决于输入类型(例如int
,float
)。__future__
特性division
,改变了除法语义如下(PEP 238的TL;DR):
/
映射到__truediv__
,必须“返回除法的数学结果的合理近似值”(引用自PEP 238)//
映射到__floordiv__
,应该返回/
的向下取整结果__div__
。from __future__ import division
/
和//
。
480 * 320 // 640
得到预期的240
。 - Karl Knechtel