2017-08-16 76 views
1

我需要nanosec的当前时间。 作为字符串"%.9f" % float_time它是1502872986.6536936 。最后你可以看到76。 如果我尝试写的同时,INT int(float_time*10**9),这将是15028729866536936 和96底。为什么?哪个是获得纳米格式的正确途径?字符串和int格式的浮点差异。为什么?

from time import time 

float_time = time() 
print("float_time:", float_time) 
int_nano_time = int(float_time*10**9) 
print("int_nano_time:", int_nano_time) 
str_nano_time = "%.9f" % float_time 
print("str_nano_time:", str_nano_time) 

float_time:1502872986.6536937

int_nano_time:1502872986653693696

str_nano_time:1502872986.653693676

解决方案:

time.monotonic() 

float_time:536596.296

int_nano_time:5365962.96亿

str_nano_time:536596.296000000

+1

[Python使用IEEE-754双精度(https://docs.python.org/3.3/tutorial/floatingpoint.html),因此具有在有效数部分只有53位,它们是约15〜17个十进制数字(1502872986.6536936有17位有效数字,其余只是噪声) –

+1

@Elena很可能返回的'time()'不正确到纳秒精度。 –

+0

@AnttiHaapala是否有可能在Python中获得int int的nanosec?在C++世界里,他们没有问题,因为他们在64位int中得到它。他们不符合IEEE754。 – Elena

回答

1

两者都是〜15.7十进制数字的IEEE754的双精度内是正确的。其原因是,十倍数不能精确地产生,因此,尽管通过2 ** 10乘以准确,通过5 ** 10乘以将再次有舍入误差,这就是为什么在过去数不同。

'1502872986.653693675994873046875000000000' 
>>> "%.30f" % (1502872986.653693676 * 10 ** 9) 
'1502872986653693696.000000000000000000000000000000' 

这两个浮点数的十六进制表示是很大的不同:

>>> (1502872986.653693676 * 10 ** 9).hex() 
'0x1.4db4704d00617p+60' 
>>> (1502872986.653693676).hex() 
'0x1.6650166a9d61ep+30' 

至于从time()调用返回的时间 - 也极有可能的是,计算机应该有一个计时器,给人以足够的精度高任何时间值会的确切时间time()之间的时间戳被称为当它返回:

>>> (time() - time()) * 10 ** 9 
-715.2557373046875 
>>> (time() - time()) * 10 ** 9 
-953.67431640625 
>>> (time() - time()) * 10 ** 9 
-953.67431640625 

你的错误为20纳秒,但连续2个时间戳之间的时间差从返回调用time()是我的电脑上700-100纳秒。