2013-05-16 133 views
0

在600行長碼中,我有一部分代碼計算奇怪的東西。Python計算:浮點數和整數

idl = 0 
print type(dl), dl 
idl = int(dl*10)+1 
print idl 

這將返回:

<type 'float'> 0.1 
1 

該計算是在我的代碼定義完成。 這顯然不是預期的結果。奇怪的是,當我在一個單獨的Python文件中的代碼複製以上:

idl = 0 
dl = 0.1 
print type(dl), dl 
idl = int(dl*10)+1 
print idl 

我得到:

<type 'float'> 0.1 
2 

可能是什麼這個問題的根源?我已經提取了這些部分,使問題變得簡單,但如果您想要,我可以提供更多信息。

+1

鑄造到int不會繞過你的數字,而是截斷它。正因爲如此,你可以得到0.999999而不是1,所以當投射到int時它會給出0。我不確定爲什麼結果會在不同的地方有所不同,儘管...... – sashkello

+3

也許'dl'的值不像第一種情況那樣接近.1,但是Python只打印它以限制精確。我建議你以更精確的方式打印它(我不熟悉Python語法),或者打印'dl-.1'來查看其差異。正如sashkello所指出的那樣,如果'dl'略小於'.1',那麼'dl * 10'略小於1,轉換爲'int'會將其截斷爲零。 –

回答

2

Eric Postpischil的評論是on-point。

Python試圖從臨時用戶中隱藏一些醜點的浮點數。大多數時候,沒關係。有時候,你會感到驚訝。許多十進制數字不能精確地以二進制形式表示 - 它們變成重複或極長的分數。 Python的顯示代碼將二進制浮點數轉換爲小數,有時四捨五入到正確的位置。

下面是關於這一主題的固體參考:http://docs.python.org/2/tutorial/floatingpoint.html

的代碼片斷您提供的是正確的,但你可能希望使用int(round(dl*10))

如果十進制數學的浮點不精確表示使你驚愕 - 像它可能如果你是用錢的工作,例如 - 檢查出小數模塊:http://docs.python.org/2/library/decimal.html#module-decimal

小數模塊提供一流的設施用於做十進制數學運算,但比浮點運算更麻煩。

對於什麼是值得的,這個問題並不是Python獨有的。你會在大多數編程語言中發現類似的問題(和一個類似的十進制數學庫來解決這個問題。)

+0

謝謝,這個答案確實幫助我,而且事實上也是這個問題。 –