在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() 不允许使用复数。
对于用户定义的类和扩展类型,所有语义都已启动 实现类或类型。
但是这仍然没有解释为什么行为是这样实现的。
答案 0 :(得分:5)
一个可能的优点如下:如果操作的输入是float
s,那么通常最有用的输出类型是float
,因为程序正在进行浮点计算。类似地,如果操作的输入是整数(int
s或long
s),那么通常最有用的输出类型是整数。
一个相关的令人惊讶的数据点:
>>> str(int(123e300 // 10.0))
'12300000000000000348405169443457756499452463917650245579212965288916278422109198944984236481408634018703901759913201583616648277756338685989513894763895354330869046350917957229381143786183918719192956157930593465276658607709014541611368487360619735051905095032755082564499801643679232993692080863707136'
这是令人惊讶的,因为最终期望大量的0
是很自然的。由于float
类型的精度有限,您得到其他数字。
因此,通过返回float
,//
表示输出可能不准确。
答案 1 :(得分:0)
这使得地板划分与其他算术运算一致。优点是,您可以使用现有的知识和编码模式,而不是记住//
是一种特殊情况。和所有其他运算符一样,如果要强制输出为int
,则应明确强制它为此类。