2011-11-08 53 views
2

所以,我打開終端。數字如何在Python中工作?

> python 
> 1/3 
0 
> 1.0/3 
0.33333333333333331 

有人能告訴我的規則是什麼,當涉及到小數。小數點時分號碼是重要的嗎?有最佳做法嗎?

如果我想要更多的小數點,或者更少,我需要使用一個函數嗎?

回答

10

在Python <分工3.0作品就像在許多不同的編程語言和輸出是一個整數:

>>> 3/2 
1 

如果使用浮動部件的任何,輸出將是一個float還有:

>>> 3.0/2 
1.5 
>>> 3/2.0 
1.5 

但是有一個解決方案,如果你想更精確地做分割而不需要將某些部分轉換成float :

>>> from __future__ import division 
>>> 3/2 
1.5 

經過上面你仍然可以通過使用雙斜線使 「經典師」:

>>> 3 // 2 
1 

是否足夠清晰?它有幫助嗎?

+0

微小的額外注意:'3 // 2'在所有最新的Python版本中都適用於經典的劃分(正式的劃分),不論是或注意你有未來的說法。所以,如果你特別想要截斷行爲,就像那樣寫。 –

+0

@ThomasK:是的,如果你在我的回答結束時需要他們,我寫了關於使用古典分區的文章,所以它應該足夠清楚。 – Tadeck

+0

我知道 - 我只是想澄清一下,即使您未使用未來聲明,它的工作原理也是一樣的。 –

1

規則是,如果兩個輸入數字都是整數(無小數點),輸出將是一個整數,否則它將是一個浮點數。浮點精度由您的系統定義,如果您希望獲得更高精度,則需要使用庫。 Google arbitrary precision math python

如果你想劃分兩個字面整數並得到一個浮點數,那麼你給小數點哪一個並不重要,也沒有約定。這非常罕見,這不是太多人制定的規則。

0

在Python 2中,將int除以int總是將結果截斷爲int。但是,如果一個或兩個操作數都是浮點數,那麼你的答案是一個浮點數。

在選擇要顯示的小數點數方面,可以使用字符串的.format方法(http://docs.python.org/library/string.html#formatspec)。

+0

你爲什麼說「浮動或雙重「? Python只有一個浮點類型,它對應於double。 –

+0

對不起,由於某種原因,我認爲Python包含了這兩種類型,我已經更新了我的答案,以反映Python只有一種浮點類型。 –

0

要控制數字的號碼,您可以使用

>>> print("%.10f\n" % 0.4) 
0.4000000000 

這裏我們告訴打印顯示10位數字。有關可用格式的更多詳細信息,請參閱format spec

分區在python中有點混亂。的/行爲取決於命令行選項:

$ python -Qnew 
>>> 4/3 
1.3333333333333333 
>>> ^D 
$ python -Qold 
>>> 4/3 
1 
>>> 

在新的語義/總是產生一個float。 在舊版本中,如果兩個操作數都是整數,則它會生成一個int,如果至少其中一個是float,則會生成一個float。檢查您的python版本以確定哪一個是您的默認設置。要啓用新的語義,你也可以使用

from __future__ import division 

注意,這裏也是截斷除法運算符://,其將兩個數字,不論其類型的截斷的結果。如果參數都是int,它將返回一個int,如果其中至少有一個是float,則返回float。

> 5.0 // 3 
1.0 
> 5 // 3.0 
1.0 
> 5 // 3 
1 

此運算符的行爲不依賴於命令行選項。

4

默認情況下,在python2,我們有以下師的行爲:

  1. INT/INT == INT
  2. INT /浮浮==
  3. 浮法/ INT ==漂浮
  4. 浮動/浮動== float

在python3中,分割行爲已經改變,int/int返回float。這也可以通過添加以下導入在python2中啓用:

from __future__ import division 

正如您可能已經注意到float division不精確。最後一位數字中的小錯誤可能會隨意發生。這是浮法數字在硬件級別上的表現方式。你可以閱讀more about it on wikipedia

如果你想在蟒蛇精確算法它是可以做到的內置模塊decimal

>>> from decimal import Decimal 
>>> Decimal('1')/3 
Decimal('0.3333333333333333333333333333') 

也有可能改變精度:

>>> from decimal import Decimal, getcontext 
>>> getcontext().prec = 50 
>>> Decimal('1')/3 
Decimal('0.33333333333333333333333333333333333333333333333333')