防止数字四舍五入到两位小数

3

我已经花了好几天时间在编写代码上,说实话,我的头发快掉光了...我已经到处搜索,包括stackoverflow,但似乎找不到符合我困境的任何东西。

我正在使用Mint 17.3上的Python 2.7.6。我需要至少以毫秒精度处理日期/时间。处理整秒的日期和时间相当简单,但是当你加入毫秒或微秒时,它就变成了完全不同的游戏。最终,我需要遍历日志文件,并基于某些条件,找到两行日期/时间之间的差异,至少要达到毫秒精度。在这个仓库输送机情况下涉及服务器、PLC和扫描仪,精度确实很重要。日志文件的日期/时间格式如下:

12-Apr-2016 23:59:59.720321

我认为最简单的方法是将字符串转换为时间戳,然后再添加微秒。但是我对在这种情况下使用strptime并不确定,因为我知道timetuple()会剥离任何小数部分,因此这是多余的。
经过多次尝试和数天的努力,我目前的代码如下:
def timestampthen(timestring):
    tt = datetime.datetime.strptime(timestring, "%d-%b-%Y %H:%M:%S.%f").timetuple()
    ut = float(calendar.timegm(tt))
    dotpos = timestring.rfind(".")
    frac = float(timestring[dotpos:])
    utfloat = float(ut + frac)
    return utfloat

在一个例子中,ut = 1460505599.0,frac = 0.720321,但是utfloat = 1460505599.72。
我知道可以使用format和%f,但我正在使用浮点数而不是字符串。 上面的代码运行良好,但是当浮点数精度为6个或更多个小数点时,为什么会返回2位小数呢?我需要更多。 请帮我指点一下方向,谢谢。

1
我运行了你的代码,但是对我来说utfloat1460505599.720321。你怎么能说你的utfloat被舍入了呢?通过打印吗?utfloat > 1460419273.37返回什么? - Francesco
好的,我已经修改了示例以反映示例日志输出。 - David Johns
utfloat对我来说是四舍五入的。使用我的调试器进行了四舍五入。这是我在IDE(Wing pro)或命令行中得到的输出:- 1460419273.0 0.373317 1460419273.37 - David Johns
如果你执行 utfloat > 1460419273.72,你得到的是 True 还是 False - Francesco
@Francesco - 我得到了True。 - David Johns
显示剩余2条评论
1个回答

3
完整的精度实际上是存在的,因此算术上没有问题。问题在于,默认情况下,print显示变量的四舍五入的str而不是完整的精度repr
>>> ut = 1460505599.0; frac = 0.720321;
>>> ufloat = ut + frac
>>> print str(ufloat)
1460505599.72
>>> print repr(ufloat)
1460505599.720321

因此,解决您的问题只需要打印浮点数值的repr,这样它就可以以完整精度显示。希望这能帮到您 :-)

嗨,是的,我可以做到,但正如我的问题所述,我需要使用浮点数进行高精度计时和算术运算,而不是将它们打印出来。str和repr只返回字符串。完整的浮点值为什么被隐藏了,我怎么知道呢?我以为它们被四舍五入了,因此感到困惑。 - David Johns
谢谢。我会继续前进,看看会发生什么。 - David Johns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接