使用 round() 舍入 PyTables 字段

Rounding PyTables fields with round()

我正在 pytables table 中以整数格式存储一堆数据。 数据分解为字符串存储的浮点数,以避免精度损失。 例如:

>>> src.root.Timeseries.M1[0][5]
668000

如果我分解原始数字,我会得到正确的结果:

>>> round(668000 / 100000.0, 2)
6.68

但是如果我分解 PyTables 字段的 int 值,round() 根本不起作用:

>>> round(src.root.Timeseries.M1[0][5] / 100000.0, 2)
6.6799999999999997

PyTables 字段由 Int64Col() 数据类型定义。

对发生的事情有什么想法吗?

您的问题与 PyTables 无关。 PyTables 给你一个 NumPy 数组。

例如,让我们使用一个非常简单的数组:

>>> import numpy as np
>>> a = np.array([668000 ])
>>> a[0]
668000

当你四舍五入这个数字时你得到

>>>round(a[0] / 100000.0, 2)
6.6799999999999997

这是因为它的类型是 numpy.float64:

>>>type(round(a[0] / 100000.0, 2))
numpy.float64

将其转换为 Python float显示较短的结果:

>>> float(round(a[0] / 100000.0, 2))
6.68

所以你应该得到这样的东西:

>>> float(round(src.root.Timeseries.M1[0][5] / 100000.0, 2))
6.68

数值没有变化。这只是数字如何表示的问题。标准 Python float 在 NumPy 版本中表现得更好一些。 Floating point numbers毕竟是个复杂的课题

对象在 Python 中的表示方式由特殊方法 __repr__():

决定
>>> round(a[0] / 100000.0, 2).__repr__()
'6.6799999999999997'

这里用到的是:

>>> round(a[0] / 100000.0, 2)
6.6799999999999997

还有一个特殊的方法__str()__:

>>> round(a[0] / 100000.0, 2).__str__()
'6.68'

打印对象时隐式使用:

>>> print(round(a[0] / 100000.0, 2))
6.68