1

我需要纳秒的当前时间。作为字符串"%.9f" % float_time,它是 1502872986.6536936 76。你可以在最后看到 76。如果我尝试写与 int 相同的时间int(float_time*10**9),最后将是 15028729866536936 96和 96。为什么?哪个是获得纳米格式的正确方法?

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)

浮动时间:1502872986.6536937

int_nano_time: 1502872986653693696

str_nano_time: 1502872986.653693676

解决方案:

time.monotonic()

浮动时间:536596.296

int_nano_time: 536596296000000

str_nano_time: 536596.296000000

4

1 回答 1

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 纳秒。

于 2017-08-16T09:45:56.427 回答