2011-09-22 37 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 –