舍入浮动64与浮动32的差异

2024-05-19 07:22:00 发布

您现在位置:Python中文网/ 问答频道 /正文

此场景是ETL场景的简化,涉及从MySQL表中提取的多组数据。我有一个合并的数据框,其中一个价格列是类型float64,另一个是类型object

import pandas as pd

df = pd.DataFrame({
    'price1': [0.066055],
    'price2': ['0.066055'],
})

>>> df.dtypes
price1    float64
price2     object
dtype: object

当这两列被转换为float64时,列price1在四舍五入到5位时被错误地四舍五入

float64_df = df[price_cols].apply(lambda x: pd.to_numeric(x))

>>> float64_df.dtypes
price1    float64
price2    float64
dtype: object

>>> float64_df[price_cols].apply(lambda x: x.round(5))
    price1   price2
0  0.06606  0.06605

但是,当使用downcast='float'将列转换为float32时,舍入效果与预期一样

float32_df = df[price_cols].apply(lambda x: pd.to_numeric(x, downcast='float'))

>>> float32_df.dtypes
price1    float32
price2    float32
dtype: object

>>> float32_df[price_cols].apply(lambda x: x.round(5))
    price1   price2
0  0.06606  0.06606

你知道为什么当两列都是float64类型时舍入不能正常工作吗


Tags: lambda类型dfobject场景pricepdapply
3条回答

简短的回答是pd.to_numeric为两个输出不同的值:

pd.to_numeric(0.066055)
pd.to_numeric('0.066055')

# 0.066055
# 0.06605499999999999

0.066055的情况下,它simply returns the value

'0.066055'的情况下,我相信它使用this function将字符串转换为浮点

This answer也可能有帮助

以更高的精度打印浮点显示pd.to_numeric'.066055'转换为0.06605499999999998872

with pd.option_context('display.float_format', '{:0.20f}'.format):
    print(float64_df)

输出:

                  price1                 price2
0 0.06605500000000000260 0.06605499999999998872

用浮点数获得精确的数字有些不可能,而且浮点数总是有些不可预测。我的猜测是,该对象导致浮点64比原始数字小一点,例如0.06605499999999999或类似数字,从而导致意外的舍入结果

Python对此有一些看法

相关问题 更多 >

    热门问题