为何Python中timestamp()结果较1970-01-01差值多1微秒?
为什么Python中datetime的timedelta与timestamp结果微秒差1?
先看你给出的代码示例:
# 计算时间差得到timedelta datetime(2514, 5, 30, 1, 53, 4, 986754, tzinfo=dt.timezone.utc) - datetime(1970,1,1, tzinfo=dt.timezone.utc) # 输出:datetime.timedelta(days=198841, seconds=6784, microseconds=986754) # 获取时间戳 datetime(2514, 5, 30, 1, 53, 4, 986754, tzinfo=dt.timezone.utc).timestamp() # 输出:17179869184.986755
两者微秒部分差1,本质就是双精度浮点数的精度限制导致的误差,没有其他隐藏问题,具体原因如下:
timedelta通过拆分天数、秒数、微秒数的方式精确存储时间差,所以能准确保留原始的986754微秒信息。timestamp()返回的Unix时间戳(从1970-01-01 UTC到目标时间的总秒数)以双精度浮点数存储。双精度浮点数的有效二进制位数为53位,对应十进制约15-17位有效数字。当时间戳的整数部分已达到10位(如示例中的17179869184),剩余有效位数不足以精确表示所有微秒级的小数部分(需要6位有效数字),此时原始的17179869184.986754会被近似为最接近的可表示浮点数,也就是17179869184.986755。
你可以手动验证这个近似过程:把精确的总微秒数17179869184986754转换成秒后,用双精度浮点数存储时就会出现这种微小偏差。
内容的提问来源于stack exchange,提问作者ignoring_gravity
相关产品推荐
相关产品推荐

