首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串和int格式的浮点数差异。为什么?

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

Stack Overflow用户
提问于 2017-08-16 09:14:00
回答 1查看 142关注 0票数 1

我需要纳赛克的当前时间。作为string "%.9f" % float_time,它是"%.9f" % float_time你可以看到76在最后。如果我尝试与int int(float_time*10**9)相同的时间编写,那么它的末尾将是1502872986653693696和96。为什么?那么,哪种方法是获得纳米格式的正确方法呢?

代码语言:javascript
复制
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

解决方案:

代码语言:javascript
复制
time.monotonic()

float_time: 536596.296 int_nano_time: 536596296000000 str_nano_time: 536596.296000000

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-16 09:45:56

两者都是正确的,在IEEE754双精度~15.7小数位。原因是不能精确地产生十的倍数,所以虽然乘2 ** 10是精确的,但是乘以5 ** 10又会产生舍入误差,这就是最后一个数字不同的原因。

代码语言:javascript
复制
'1502872986.653693675994873046875000000000'
>>> "%.30f" % (1502872986.653693676 * 10 ** 9)
'1502872986653693696.000000000000000000000000000000'

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

代码语言:javascript
复制
>>> (1502872986.653693676 * 10 ** 9).hex()
'0x1.4db4704d00617p+60'
>>> (1502872986.653693676).hex()
'0x1.6650166a9d61ep+30'

至于从time()调用返回的时间,很可能是,如果计算机有一个具有足够高精度的时间戳的计时器,那么任何时间值都将介于调用time()的确切时间和返回时间之间:

代码语言:javascript
复制
>>> (time() - time()) * 10 ** 9
-715.2557373046875
>>> (time() - time()) * 10 ** 9
-953.67431640625
>>> (time() - time()) * 10 ** 9
-953.67431640625

您的错误是20纳秒,但是从time()调用返回的两个连续时间戳在我的计算机上的时间差是700到100纳秒。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45709564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档