![](/img/trans.png)
[英]What is the difference between 'in' and 'is' when used in an 'if' statement?
[英]What is the difference between '/' and '//' when used for division?
使用一個比另一個有好處嗎? 在 Python 2 中,它們似乎都返回相同的結果:
>>> 6/3
2
>>> 6//3
2
在 Python 3.x 中, 5 / 2
將返回2.5
而5 // 2
將返回2
。 前者是浮點除法,后者是地板除法,有時也稱為整數除法。
在 Python 2.2 或更高版本的 2.x 行中,整數沒有區別,除非您執行from __future__ import division
,這會導致 Python 2.x 采用 3.x 行為。
不管以后的導入如何, 5.0 // 2
將返回2.0
因為這是操作的樓層划分結果。
您可以在https://docs.python.org/whatsnew/2.2.html#pep-238-changed-the-division-operator找到詳細說明
為了澄清 Python 2.x 行, /
既不是樓層划分也不是真正的划分。
/
當兩個args 都是int
時是地板除法,但當任何一個 args 都是float
時是真正的除法。
//
實現“樓層划分”,無論您的類型如何。 所以1.0/2.0
會給出0.5
,但1/2
、 1//2
和1.0//2.0
都會給出0
。
有關詳細信息,請參閱https://docs.python.org/whatsnew/2.2.html#pep-238-changed-the-division-operator
/ --> 浮點除法
// --> 樓層划分
讓我們看看 Python 2.7 和 Python 3.5 中的一些示例。
Python 2.7.10 與 Python 3.5
print (2/3) ----> 0 Python 2.7
print (2/3) ----> 0.6666666666666666 Python 3.5
Python 2.7.10 與 Python 3.5
print (4/2) ----> 2 Python 2.7
print (4/2) ----> 2.0 Python 3.5
現在,如果您想要(在 python 2.7 中)與 python 3.5 中的輸出相同,您可以執行以下操作:
蟒蛇 2.7.10
from __future__ import division
print (2/3) ----> 0.6666666666666666 #Python 2.7
print (4/2) ----> 2.0 #Python 2.7
在 python 2.7 和 Python 3.5 中,樓層划分之間沒有區別
138.93//3 ---> 46.0 #Python 2.7
138.93//3 ---> 46.0 #Python 3.5
4//3 ---> 1 #Python 2.7
4//3 ---> 1 #Python 3.5
正如大家已經回答的那樣, //
是樓層划分。
為什么這很重要是//
是明確的樓層划分,在 2.2 的所有 Python 版本中,包括 Python 3.x 版本。
/
的行為可以改變取決於:
__future__
導入與否(模塊本地)-Q old
或-Q new
>>> print 5.0 / 2
2.5
>>> print 5.0 // 2
2.0
Python 2.7 和其他即將推出的 Python 版本:
/
)將左手操作數除以右手操作數
示例: 4 / 2 = 2
//
)操作數的除法,結果是去除小數點后數字的商。 但如果其中一個操作數為負,則結果為底,即從零舍入(向負無窮大):
示例: 9//2 = 4
和9.0//2.0 = 4.0
, -11//3 = -4
, -11.0//3 = -4.0
/
Division 和//
floor Division 運算符都以類似的方式運行。
雙斜線//
是樓層划分:
>>> 7//3
2
在這個答案中,我不僅會講答案,而且還會講解//的好處。
你們大多數使用Python的人都必須了解Python中的地板分割運算符(//)。 對於那些不知道的對象,此運算符將除法后返回底值。 例如:5/2 = 2.5,但是5 // 2 = 2(2是下限值2.5)
但是除法運算符通常對於大於10 ^ 17的數字表現異常。
x = 10000000000000000000006
if x / 2 == x // 2:
print("Hello")
else:
print("World")
對於上面的代碼,將打印World而不是Hello。 這是因為10000000000000000000006/2將返回5e + 21,但是10000000000000000000006 // 2將返回正確的答案5000000000000000000003。即使int(10000000000000000000006/2)也將返回5000000000000000000000,這是不正確的。
因此,即使要除以大數,也請使用//運算符。
例如:如果要查找前100000000000000000000000010002個數字的總和,且公式為:n(n + 1)/ 2,則正常除法運算符(/)將為您提供錯誤的答案,但是//運算符將為您提供正確的答案。
//
是地板除法,它總是會給你結果的整數地板。 另一種是“常規”划分。
方程的答案四舍五入到下一個較小的整數或浮點數,小數點為 .0。
>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0
上面的回答都很好。 我想補充一點。 直到某些值,它們都會導致相同的商。 在該樓層除法運算符 ( //
) 工作正常但除法 ( /
) 運算符之后:
>>> int(755349677599789174 / 2) # wrong answer
377674838799894592
>>> 755349677599789174 // 2 # correct answer
377674838799894587
//
是地板除法,它總是會給你結果的地板值。/
是浮點除法。 以下是/
和//
之間的區別; 我已經在 Python 3.7.2 中運行了這些算術運算
>>> print (11 / 3)
3.6666666666666665
>>> print (11 // 3)
3
>>> print (11.3 / 3)
3.7666666666666667
>>> print (11.3 // 3)
3.0
Python 3.x 澄清
只是為了補充一些以前的答案。
重要的是要注意:
一//二
是地師。 如:
math.floor(a/b)
不是int除法。 如:
整數(a/b)
不是四舍五入到 0 浮點除法。 如:
回合(a/b,0)
因此,當涉及正數和負數時,行為方式是不同的,如下例所示:
1 // 2 為 0,如:
math.floor(1/2)
-1 // 2 是 -1,如:
math.floor(-1/2)
手術 結果 筆記 x / y
x和y 的商 x // y
x和y 的底商 (1) 筆記:
- 也稱為整數除法。 結果值是一個整數,盡管結果的類型不一定是 int。 結果總是向負無窮大舍入:
1//2
是0
,(-1)//2
是-1
,1//(-2)
是-1
,(-1)//(-2)
是0
.
手術 結果 筆記 x / y
x和y 的商 (1) x // y
(floored) x和y 的商 (4)(5) 筆記:
1. 對於(普通或長)整數除法,結果為整數。 結果總是向負無窮大舍入:1/2 為 0,(-1)/2 為 -1,1/(-2) 為 -1,(-1)/(-2) 為 0。請注意如果任一操作數是長整數,則無論數值如何,結果都是長整數。
5. 也稱為整數除法。 結果值是一個整數,盡管結果的類型不一定是 int。
import math
N = 1004291331219602346 # huge number
print(N//100) #=> 10042913312196023 is correct answer
print(math.floor(N/100)) #=> 10042913312196024 is wrong answer
print(math.ceil(N/100)) #=> 10042913312196024 is wrong answer
print(int(N/100)) #=> 10042913312196024 is wrong answer
我想到了int(x/y)
的評估。
首先,Python 計算表達式x/y
並得到 INEXACT 浮點數 z。
其次,Python 計算表達式int(z)
。
當顯着性損失不可忽視時,我們會得到錯誤的結果。
5.0//2
導致2.0
,而不是2
因為//
運算符的返回值的返回類型遵循 python 強制(類型轉換)規則。
Python 提倡將較低的數據類型(整數)轉換為較高的數據類型(浮點數)以避免數據丟失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.