python 3 floor division并不总是导致int

时间:2014-03-05 21:05:07

标签: python python-3.x

在python3中使用floor division时(也可能在 future 中使用python2),例如在

>>> 2//2
1

输出是预期的整数。但是只要一个操作数是浮点数,就会得到一个浮点数

>>> 2.0//2.0
1.0
>>> 2.0//2
1.0
>>> 2//2.0
1.0

我想这是有意的,但实际上我不明白,为什么它应该是这样的。使用先前未确定的数据类型作为总是产生整数的操作的结果是什么?

最好的广泛搜索给了我(来自PEP 238

  

分区的语义

     

分区将在所有Python数字中实现      类型,并将具有

的语义
   a // b == floor(a/b)
     

除了结果类型将是a的常见类型      在手术前强迫和b。

     

具体来说,如果a和b属于同一类型,则// b将为      那种类型。如果输入的类型不同,那么它们就是      首先使用与所有人相同的规则强制使用普通类型      其他算术运算符。

     

特别是,如果a和b都是int或long,结果就是      与这些类型的经典除法相同的类型和价值      (包括混合输入类型的情况; int // long和long // int      将两者都返回。)

     

对于浮点输入,结果是浮点数。例如:

 3.5//2.0 == 1.0
     

对于复数,//引发异常,因为a的floor()      不允许使用复数。

     

对于用户定义的类和扩展类型,所有语义都已启动      实现类或类型。

但是这仍然没有解释为什么行为是这样实现的。

2 个答案:

答案 0 :(得分:5)

一个可能的优点如下:如果操作的输入是float s,那么通常最有用的输出类型是float,因为程序正在进行浮点计算。类似地,如果操作的输入是整数(int s或long s),那么通常最有用的输出类型是整数。

一个相关的令人惊讶的数据点:

>>> str(int(123e300 // 10.0))
'12300000000000000348405169443457756499452463917650245579212965288916278422109198944984236481408634018703901759913201583616648277756338685989513894763895354330869046350917957229381143786183918719192956157930593465276658607709014541611368487360619735051905095032755082564499801643679232993692080863707136'

这是令人惊讶的,因为最终期望大量的0是很自然的。由于float类型的精度有限,您得到其他数字。

因此,通过返回float//表示输出可能不准确。

答案 1 :(得分:0)

这使得地板划分与其他算术运算一致。优点是,您可以使用现有的知识和编码模式,而不是记住//是一种特殊情况。和所有其他运算符一样,如果要强制输出为int,则应明确强制它为此类。