2014-11-04 212 views
9

我是编程和Python的初学者。我正在做一些简单的数学运算。正如我们所知,Python解释器中的3/2给出了1。但-3/2给出-2。你能指出这里的区别吗?3/2和-3/2有什么区别?

+4

'3/2' - > 1.5,向下取整为1.'-3/2' - > -1.5,向下取整至-2。 – 2014-11-04 17:04:35

+0

另请参阅http://stackoverflow.com/a/19518866/190597,解释为什么Python向负无穷发展。 – unutbu 2014-11-04 17:07:39

回答

5

在Python 2,/执行整数除法。这意味着如果结果不是整数,则结果为舍入为下一个整数值。当该值为负时,这自然会变成更大幅度的负数。

直观上,整数除法的结果就是浮点除法的结果mathematical floor。为此,整数除法通常也被称为floor division

floor(1.5) # Returns 1.0 
floor(-1.5) # Returns -2.0 

有可能通过将from __future__ import division在您的模块的顶部,以改变在Python 2此行为。此输入将使/运营商仅指示真正的划分(浮点划分),并使//运营商能够进行明确的地板划分(整数划分)。这些约定都是标准在Python 3

from __future__ import division 

print(3/2) # 1.5 
print(3//2) # 1 

正如评论@Dunes笔记,这是值得注意的是,-/一个更高的优先级,因此-3/2相当于(-3)/2而非-(3/2)。如果首先应用该部门,结果确实是-1

+0

我认为四舍五入通常被称为“floor”+1,因为它比我更好地解释它 – 2014-11-04 17:06:46

+0

值得注意的是'-'是一元运算符,与分割运算符绑定更紧密。如果是相反的话,结果将是相同的。 – Dunes 2014-11-04 17:10:16

+0

在Python 3.4.2中,'int(-1.5)'返回'-1'。 – 2014-11-05 16:16:20

4
-3/2 == -1.5 , floor(-1.5) = -2 

同样

3/2 == 1.5 , floor(1.5) = 1 
1

Python有两个分部操作员。

  1. /

  2. //

这里,//将总是圆的结果为最接近的整数(不论操作数的类型的)。这被称为地板分区。但/将四舍五入到最接近的整数,如果两个操作数都是整数,则表示其中的任何一个操作数都是浮点数,则进行实际除法。

的差异可以与本实施例中可以清楚地理解,

>>> 11/4 
2 
>>> 11.0/4 
2.75 
>>> 11//4 
2 
>>> 11.0//4.0 
2.0 

Python Documentation on floor division引用,

数学除法该回合下来到最接近的整数。地板分区操作员是//。例如,表达式11 // 4评估为2,与浮法真正划分返回的结果相反。 请注意(-11) // 4-3,因为那是-2.75向下舍入为。见PEP 238

引用文本的最后一行是您实际问题的答案。

+0

地板划分和舍入到最近的整数是两个不等价的概念。在Python 3.4.2中,'5 // 3'将产生1,'round(5/3)'将产生2.'// //'运算符总是向负无穷大转。 – 2014-11-05 16:20:08