gpt4 book ai didi

python - python 2 和 3 之间日期时间舍入的奇怪行为

转载 作者:太空狗 更新时间:2023-10-29 18:12:47 26 4
gpt4 key购买 nike

在 python 2 中,我们有:

>>> datetime.datetime.utcfromtimestamp(1000000000005.0/1000.0)
datetime.datetime(2001, 9, 9, 1, 46, 40, 5000)

但是在 python 3 中,我们有:

>>> datetime.datetime.utcfromtimestamp(1000000000005.0/1000.0)
datetime.datetime(2001, 9, 9, 1, 46, 40, 4999)

这种奇怪的舍入行为的原因是什么?它是故意的吗?是不是 1000000000005.0 仍然在 double 范围内,还有几位数?

最佳答案

下面我基本上包含了 utcfromtimestamp(我将它稍微修改为独立的)。

在 Python 2 中:

import time, datetime
def utcfromtimestamp(t):
y, m, d, hh, mm, ss, weekday, jday, dst = time.gmtime(t)
us = int((t % 1.0) * 1000000)
ss = min(ss, 59)
return datetime.datetime(y, m, d, hh, mm, ss, us)

在 Python 3 中:

import time, datetime
def utcfromtimestamp(t):
t, frac = divmod(t, 1.0)
us = int(frac * 1e6)
if us == 1000000:
t += 1
us = 0
y, m, d, hh, mm, ss, weekday, jday, dst = time.gmtime(t)
ss = min(ss, 59)
return datetime.datetime(y, m, d, hh, mm, ss, us)

(输入 1000000000005.0/1000.0 计算为 1000000000.005。)

在我的独立版本中:

Python 2 使用取模运算符 % 来确定输入是整数还是分数。语句 (t % 1.0) * 1000000 然后将分数(在我们的例子中为 0.004999995231628418)乘以 1000000。这将返回 4999.995231628418,通过 int 向下舍入为 4999

Python 3 使用 divmod 返回整数 (t) 1000000000.0 和分数 (frac) 0.005。它没有返回这个,而是返回 t 作为 1000000000frac 作为 0.004999995231628418。然后使用 frac * 1e6 计算 us。这是将 0.004999995231628418 乘以 1000000 得到 4999.995231628418,通过 int 四舍五入为 4999

使用的方法并没有真正的区别。两者都是准确的,并返回相同的结果。我的结论是 Python 2 将微秒向上舍入,而 Python 3 将微秒向下舍入。

关于python - python 2 和 3 之间日期时间舍入的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28109011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com