2013-04-11 59 views
1

這看起來很簡單,但由於某些原因,它不起作用。我需要在某些時候輸出一個值,但if語句似乎沒有評估。以下是我想要做的基本版本。如果聲明不起作用(Python)

dt=.1 

while t<=10: 
    if t==5: 
      print('yes') 
    t+=.1 

我已經在我的代碼字面上嘗試這樣做,我甚至已經受夠了印花T爲每一次的一步,但它不會打印「是」。我有我的代碼中的其他if語句,如

if 10<=t<60: 
    do stuff 

以及這些if語句完美運行。我已經嘗試過t==5.0t==float(5),以防萬一它需要但它也不起作用。這讓我瘋狂,所以如果有人能幫助我,那會很棒。我在Spyder上在Ubuntu 12.4上運行了這個功能,我收到一條消息,說import sitecustomize失敗。這與它有什麼關係?我已經使用該消息運行了一段時間的代碼,並且之前沒有造成任何問題。

編輯

得到它的工作,我用

if int(t)==5 and t<5+dt: 

感謝您的幫助

+9

[浮點不精確(http://docs.python.org/2/tutorial/floatingpoint.html) – jamylak 2013-04-11 05:16:29

+2

HTTP:/ /docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html計算機科學家應該知道什麼關於浮點運算 – Patashu 2013-04-11 05:17:37

回答

3

1)浮點沒有無限精度 - 它們在內存中佔用一定數量的位(通常是64或32)。

2)他們使用尾數的二進制內部表示(所有的有效數字,但第一個,基本上)。 3).1不能作爲二進制表示精確地存儲 - 只能作爲二進制位的無限重複模式,並且由於尾數僅如此之大,浮點數實際上是近似值.1,而不是真正的0.1。 (但是0.5和0.25這樣的東西可以)但是)

4)因此,加起來的.1s並不能保證有完美的結果 - 會出現錯誤的方法。例如,.1添加到自己十次可能會使1.0000 ... 1或0.999999 ... 9。

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html什麼每臺計算機科學家應該知道關於浮點運算

0

這是因爲你的t是浮點並與不是100%的準確率在代表機器碼。您需要將其轉換爲整數,或更改if條件,以便修復此問題(轉換爲整數或使用不等式)。

0

試試這個轉換噸(這就是浮存)爲整數,然後比較..

if int(t) == 5: 
    ... 

OR

import math 
t_flr = math.floor(t) 
if t_flr == 5: 
    ... 
+2

我寧願使用'round'而不是'floor',因爲您不知道在哪個方向錯誤將是。 – Patashu 2013-04-11 05:22:41

+0

謝謝,一旦我做了一個小小的調整,這個效果很好。 – nickg 2013-04-11 05:51:41

2

有很多評論爲什麼浮點算術不準確,但沒有答案如何修復代碼。

長話短說,while t<10.0+dt/2if abs(t-5.0) <= dt/2

1

基於您編寫的代碼寫得很差的示例對我來說工作得不錯。
所以精確控制可能是你在找什麼:
http://docs.python.org/3.3/library/decimal

from decimal import * 
    getcontext().prec = 3 

    dt=.1 

    t = 0 

    while t <= 10: 
     if Decimal(t) == 5: 
      print('yes') 
     t = Decimal(Decimal(t) + Decimal(dt)) 
     print(t)