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

时间:2015-01-23 11:33:42

标签: python datetime rounding

在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)

这种奇怪的舍入行为的原因是什么? Isn&#t; t 1000000000005.0仍然在双打范围内,只有几位数?

1 个答案:

答案 0 :(得分:1)

下面我基本上包括了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.9952316284184999向下舍入到int

Python 3使用divmod返回整数(t1000000000.0和分数(frac0.005。 它不会返回此内容,而是将t作为1000000000返回,将frac作为0.004999995231628418返回。 然后使用us计算frac * 1e6。这会将0.004999995231628418乘以1000000,从而生成4999.9952316284184999向下舍入到int

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