使用 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
我正在 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