字符串和int格式的浮点差异。为什么?

时间:2017-08-16 09:14:01

标签: python python-3.x precision floating-accuracy nanotime

我需要使用nanosec的当前时间。 作为字符串"%.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)
  

float_time:1502872986.6536937

     

int_nano_time:1502872986653693696

     

str_nano_time:1502872986.653693676

解决方案:

time.monotonic()
  

float_time:536596.296

     

int_nano_time:536596296000000

     

str_nano_time:536596.296000000

1 个答案:

答案 0 :(得分:1)

两者在IEEE754双精度~15.7十进制数字内都是正确的。原因是10的倍数无法准确生成,因此乘以&fun是精确的,乘以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()

你的错误是20纳秒,但是>>> (time() - time()) * 10 ** 9 -715.2557373046875 >>> (time() - time()) * 10 ** 9 -953.67431640625 >>> (time() - time()) * 10 ** 9 -953.67431640625 调用返回的2个连续时间戳之间的时差在我的计算机上是700-100纳秒。