Pandas在应用于序列的第(2)轮之后保留值的小数部分,如.9998344



我有一个带有6位小数的浮点值的数据集。我需要把它四舍五入到两位小数。问题在于一些浮点值接近1。在应用第(2(轮后,我得到了1.00,而不是0.99。也许这在数学上是正确的,但我需要有0.99这样的值。因此,我的客户需要两位小数,我无法更改。

ones_list = [0.998344, 0.996176, 0.998344, 0.998082]
df = pd.DataFrame(ones_list, columns=['value_to_round'])
df['value_to_round'].round(2)
1.0
1.0
1.0
1.0

我看到了一些选项:

  • 使用floor而不是round(但您对0.005有同样的问题吗?(

  • 使用clip在0.99:列中设置最大值(和最小值(

    df['value_to_round'].round(2).clip(upper=0.99)
    

请参考数学中四舍五入的基本原理,您正试图使用.round(2(对点后面的2位数字进行四舍五进

如果你用.round(2(对0.999进行四舍五入,你当然会得到1.0,因为最后一个"9"数字(0.009(将变成0.01,因此将被添加到0.09,然后变成0.1,再添加0.9,最后变成1.0

如果你真的想要0.99这样的值,只需要取点后面的两位小数。您可以尝试以下方法之一:

import math
df['value_to_round'] = df['value_to_round'] * 100
df['value_to_round'] = df['value_to_round'].apply(math.trunc)
df['value_to_round'] = df['value_to_round'] / 100

df['value_to_round'] = df['value_to_round'].astype(str)
df['value_to_round'] = df['value_to_round'].str[:4]
df['value_to_round'] = df['value_to_round'].astype(float)

当我试图显示R的平方值时,我也经历了同样的事情,我所做的只是使用四舍五入(3(,因为小数点后3位数不会影响

我希望这能有所帮助:(

df['value_to_round']=[x if x<1 else 0.99 for x in df['value_to_round'].round(2(]