防止四舍五入到小数点后两位

Posted

技术标签:

【中文标题】防止四舍五入到小数点后两位【英文标题】:Preventing rounding to 2 decimal places 【发布时间】:2016-05-02 08:17:24 【问题描述】:

我已经编写了一些代码好几天了,老实说,我已经没有多少头发了……我到处搜索,包括 ***,但我似乎找不到任何符合我的困境的东西。

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

我知道我可以使用格式和 %f,但我使用的是浮点数而不是字符串。 上面的代码工作正常,但为什么浮点数在 6 或更多时返回小数点后 2 位精度?我需要更多。 请给我一些指导,为我指明正确的方向。

【问题讨论】:

我运行你的代码,但utfloat 对我来说是1460505599.720321。你怎么能说你的 utfloat 是四舍五入的?打印? utfloat > 1460419273.37 返回什么? 好的,我已经更改了示例以反映示例日志输出 utfloat 对我来说是四舍五入的。使用我的调试器它是四舍五入的。这是我在 IDE(Wing pro)或命令行中得到的输出:- 1460419273.0 0.373317 1460419273.37 如果你执行utfloat > 1460419273.72,你会得到True还是False @Francesco - 我明白了 【参考方案1】:

实际存在全精度,所以算术没有问题。

问题在于,默认情况下,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 只返回字符串。为什么隐藏了完整的浮点值,我怎么知道?我以为它们是四舍五入的,因此我很困惑。 谢谢。我会继续看看会发生什么。

以上是关于防止四舍五入到小数点后两位的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008:为啥不四舍五入到小数点后两位?

如何用 Python 四舍五入到小数点后两位?

Spark Java 将数据帧中的每个值四舍五入到小数点后两位。

如何在 C# 中将数字四舍五入到小数点后两位?

浮点数四舍五入到小数点后两位

如何将数值四舍五入后保留两位小数点