You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas读取CSV浮点数出现多余末尾数字,如何解决?

嘿,这个问题其实是浮点数二进制存储的精度bug在搞怪!Pandas和Python标准库csv的处理逻辑不一样,才导致了这个差异:

csv.DictReader默认把读取的内容当成字符串来处理,你打印的其实就是文件里的原始字符串值;但Pandas会自动把数值列解析成float64类型——而这类浮点数在二进制存储时,没法精确表示某些十进制小数(比如你用到的2.989583333),所以就会出现末尾那串多余的数字。

这里给你几个实用的解决办法:

  • 办法一:读取时强制列类型为字符串
    直接告诉Pandas把end_beat列当成字符串读,这样就能完全保留原始的数值格式:

    import pandas as pd
    df = pd.read_csv('debug.csv', dtype={'end_beat': str})
    print(df['end_beat'][1])  # 输出 1.989583333
    

    如果之后需要做数值计算,再按需转换成高精度的数值类型就好。

  • 办法二:用Decimal类型存储,彻底避免精度损失
    如果你需要精准的数值计算,不想依赖float的话,可以在读取时把列转换成Decimal类型:

    import pandas as pd
    from decimal import Decimal
    
    df = pd.read_csv('debug.csv', converters={'end_beat': Decimal})
    print(df['end_beat'][1])  # 输出 1.989583333
    

    Decimal类型能完美精确表示十进制小数,适合对精度要求高的场景。

  • 办法三:格式化输出,临时隐藏多余位数
    要是只是输出的时候不想看到那串尾巴,直接格式化打印就行:

    import pandas as pd
    df = pd.read_csv('debug.csv')
    # 保留9位小数,和原始数值的位数一致
    print("{0:.9f}".format(df['end_beat'][1]))
    

    或者也可以用Pandas的round方法统一处理整列数据:

    df['end_beat'] = df['end_beat'].round(9)
    print(df['end_beat'][1])
    

内容的提问来源于stack exchange,提问作者Raven Cheuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:34:05