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

Pandas处理CSV时8.1e-202精度异常,其他浮点值正常的原因及修正

浮点数精度导致Pandas读写CSV时数值异常的问题及格式保留需求

我在使用Pandas读取CSV生成DataFrame、计算后再导出到新CSV的过程中,发现一个奇怪的现象:数值8.1e-202被自动修改为8.1000000000000005e-202,但其他类似的科学计数法数值都能正常保留。

示例复现

示例文件example.csv内容:

id,e-value
ID1,1e-20
ID2,8.1e-202
ID3,9.24e-203

执行代码:

import pandas as pd
df = pd.read_csv("example.csv")
df.iloc[1]["e-value"]
>>> 8.1000000000000005e-202

df.iloc[2]["e-value"]
>>> 9.24e-203

为什么只有8.1e-202出现这种“篡改”,而9.24e-203却能正常显示?

尝试的解决方案(无效)

  1. 查看默认数据类型:
df["e-value"].dtype
>>> dtype('float64')
  1. 尝试改用numpy的longdouble类型读取:
import numpy as np
df = pd.read_csv("./temp/test", dtype={"e-value" : np.longdouble})

结果依然异常:

df.iloc[1]["e-value"]
>>> 8.100000000000000522e-202

我测试了大于或小于8.1e-202的多个数值,都没有出现这个问题,求解释原因?

编辑补充:
我明白浮点数本身存在精度缺陷,但现在的核心需求是:将DataFrame写回CSV后,第二行要显示为ID2,8.1e-202,而不是带多余小数位的数值。我尝试过格式化列的方法,但这个方案会把原本正常的其他浮点数也强制转为科学计数法,不符合预期:

def format_eval(e):
    return "{0:.1e}".format(e)

df["e-value"] = df["e-value"].apply(lambda x: format_eval(x))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:25:21