小能豆

如何在 Python 中正确舍入 df 列中的数字?

py

date        ticker  open    high    low     close   adjClose
2019-07-08  AAPL    50.2025 50.35   49.6025 50.005  48.516
2019-07-09  AAPL    49.8    50.3775 49.7025 50.31   48.8119
2019-07-10  AAPL    50.4625 50.9325 50.39   50.8075 49.2946
2019-07-11  AAPL    50.8275 51.0975 50.4275 50.4375 48.9356
2019-07-12  AAPL    50.6125 51.0    50.55   50.825  49.3116
2019-07-15  AAPL    51.0225 51.4675 51.0    51.3025 49.7748
2019-07-16  AAPL    51.1475 51.5275 50.875  51.125  49.6026
2019-07-17  AAPL    51.0125 51.2725 50.8175 50.8375 49.3237
2019-07-18  AAPL    51.0    51.47   50.925  51.415  49.884

我想将关闭列四舍五入到小数点后两位。我尝试了以下方法:

df['close'] = round(df['close'], 2)
df.loc[:, 'close'] = df.loc[:, 'close'].round(2)
df.loc[:, 'close'] = df.loc[:, 'close'].apply(lambda x: Decimal(x).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP))
df.loc[:, 'close'] = df.loc[:, 'close'].apply(lambda x: Decimal(x).quantize(Decimal('0.01')))
df.loc[:, 'close'] = np.round(df.loc[:, 'close'], 2)

但我能做的最好的就是:

date        ticker  open    high    low     close   adjClose
2019-07-08  AAPL    50.2025 50.35   49.6025 50.01   48.516
2019-07-09  AAPL    49.8    50.3775 49.7025 50.31   48.8119
2019-07-10  AAPL    50.4625 50.9325 50.39   50.81   49.2946
2019-07-11  AAPL    50.8275 51.0975 50.4275 50.44   48.9356
2019-07-12  AAPL    50.6125 51.0    50.55   50.83   49.3116
2019-07-15  AAPL    51.0225 51.4675 51.0    51.30   49.7748
2019-07-16  AAPL    51.1475 51.5275 50.875  51.13   49.6026
2019-07-17  AAPL    51.0125 51.2725 50.8175 50.84   49.3237
2019-07-18  AAPL    51.0    51.47   50.925  51.41   49.884

日期应该是2019-07-1851.42,但我得到了51.41。根据我使用的五种方法中的哪一种,有些甚至无法适当地舍入2019-07-08 50.0052019-07-12 50.825,因为我得到了50and50.82而不是50.01and 50.83

那么我怎样才能正确地舍入它呢?


阅读 138

收藏
2023-07-10

共1个答案

小能豆

在处理浮点数时,舍入错误是常见的问题,因为浮点数的表示存在精度限制。为了正确舍入浮点数列,您可以使用字符串格式化来控制舍入行为。

以下是一种方法,使用字符串格式化将浮点数舍入到小数点后两位:

df['close'] = df['close'].apply(lambda x: "{:.2f}".format(x))

这将使用字符串格式化将浮点数转换为字符串,并将其舍入到两位小数。

另一种方法是使用NumPy的around()函数,它执行四舍五入到指定小数位数的舍入操作:

import numpy as np

df['close'] = np.around(df['close'], decimals=2)

这将使用NumPy的around()函数将浮点数列舍入到两位小数。

这两种方法都可以确保正确的舍入行为,而不受浮点数表示精度的影响。

2023-07-10