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.005和2019-07-12 50.825,因为我得到了50and50.82而不是50.01and 50.83。
51.42
51.41
50.005
50.825
50
50.82
50.01
50.83
那么我怎样才能正确地舍入它呢?
在处理浮点数时,舍入错误是常见的问题,因为浮点数的表示存在精度限制。为了正确舍入浮点数列,您可以使用字符串格式化来控制舍入行为。
以下是一种方法,使用字符串格式化将浮点数舍入到小数点后两位:
df['close'] = df['close'].apply(lambda x: "{:.2f}".format(x))
这将使用字符串格式化将浮点数转换为字符串,并将其舍入到两位小数。
另一种方法是使用NumPy的around()函数,它执行四舍五入到指定小数位数的舍入操作:
around()
import numpy as np df['close'] = np.around(df['close'], decimals=2)
这将使用NumPy的around()函数将浮点数列舍入到两位小数。
这两种方法都可以确保正确的舍入行为,而不受浮点数表示精度的影响。