2011-09-22 34 views
0

是否可以在Python 2.5中將time.time()的輸出作爲Decimal接收?Python 2.5 time.time()十進制

如果不是(並且它必須是浮點數),那麼是否有可能保證不準確性總是會超過(而不是小於)原始值。換句話說:

>>> repr(0.1) 
'0.10000000000000001' # More than 0.1 which is what I want 

>>> repr(0.99) 
'0.98999999999999999' # Less than 0.99 which is unacceptable 

代碼示例:

import math, time 

sleep_time = 0.1 

while True: 
    time_before = time.time() 
    time.sleep(sleep_time) 
    time_after = time.time() 
    time_taken = time_after - time_before 
    assert time_taken >= sleep_time, '%r < %r' % (time_taken, sleep_time) 

編輯:

現在使用以下(不測試失敗,但仍然可以從理論上失敗):

import time 
from decimal import Decimal 

def to_dec(float_num): 
    return Decimal('%2f' % float_num) 

sleep_time = to_dec(0.1) 

while True: 
    time_before = to_dec(time.time()) 
    time.sleep(float(sleep_time)) 
    time_after = to_dec(time.time()) 
    time_taken = time_after - time_before 
    assert time_taken >= sleep_time, '%r < %r' % (time_taken, sleep_time) 
    print 'time_taken (%s) >= sleep_time (%s)' % (time_taken, sleep_time) 
+2

爲了幫助我們給予合理的答案,你能解釋這背後要求的真正目的是什麼? – NPE

+0

這是一個定時功能,需要在可能睡眠的呼叫前後註冊一個時間。所以'在睡眠時間>之前的時間之後斷言 - 浮動並不總是這種情況。記住time.time()給你一個浮點數。 – Metalshark

回答

2

您可以簡單地多個time.time()通過某些值來獲得您想要的精度(請注意,許多調用無法保證亞秒級精度)。所以,

startTime = int(time.time() * 100) 
#... 
endTime = int(time.time() * 100) 

將滿足您的條件endTime - startTime >= sleepTime

0

正是出於這之前需要和可能睡一個電話後,登記時間的定時功能。因此,在睡眠時間> =之前,花車時間並不總是這樣。

我認爲你的要求是不一致的。您似乎想要調用相同的功能兩次,並且第一次調用的結果爲向下,第二次調用將結果向上舍入向上

如果我是你:

  1. 我最好的時間很多電話,而不是隻有一個。
  2. 當得出任何結論時,我會考慮計時器的解決方案和任何浮點問題(如果相關)。
+0

其要求可以被解釋爲不一致。然而,從測試來看,如果before_time正好向上,斷言永遠不會失敗;即 - 之前,+之前+之後,+之前 - 之後全部通過並且之前+之前+之後失敗。 – Metalshark

1

你可以格式化你的浮點值像這樣:

>>> '%.2f' % 0.99 
'0.99' 

Python's String Formatting Operations

+0

這適用於輸出,但如果您需要存儲值,然後進行比較,則需要確保將它們存儲爲'int'以避免不精確 – brc

+0

此問題與表示錯誤有關的多於不精確性。請參閱:http://docs.python.org/tutorial/floatingpoint.html#representation-error –