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

保存Pandas DataFrame至CSV时数值出现偏移问题求助

问题:DataFrame四舍五入后保存CSV出现微小数值偏移

最小复现示例

import pandas as pd

# 注:原代码需先将字典转为DataFrame,否则无法调用round方法
df = pd.DataFrame({
  "value1": [110.589, 222.534, 390.123],
  "value2": [50.111, 40.086, 45.334]
})

df.round(1)
# checkpoint:调试时看到四舍五入后数值为 [110.6000, 222.5000, 390.1000] 等
df.to_csv("output.csv")

现象

调试时四舍五入后的数值显示为预期的一位小数形式,但保存为CSV后,部分数值出现微小偏移,比如110.6变成110.600000000001,222.5变成222.499999999999等,偏移量固定为±0.000000000001。

原因

这是二进制浮点数的精度局限性导致的:

  • 很多十进制小数(比如0.1)无法用二进制浮点数精确存储,只能以近似值的形式存在于内存中。
  • 调试工具显示的四舍五入数值是格式化后的结果(仅展示4位小数),但内存中实际存储的是接近目标值的二进制近似值。
  • 保存CSV时,pandas默认会输出足够多的小数位来还原这个内存中的近似值,于是出现肉眼可见的微小偏移。
  • 额外注意:原代码中df.round(1)未重新赋值给df,这会导致原DataFrame并未被修改——如果你的实际代码也是如此,调试看到的数值只是临时返回结果,原数据还是未四舍五入的浮点数,会加剧精度问题。

解决方法

1. 保存CSV时强制指定小数位数(最简便)

使用to_csv的float_format参数,直接控制输出的小数位数,避免显示精度问题:

# 先正确赋值四舍五入后的结果
df = df.round(1)
# 保存时指定保留1位小数
df.to_csv("output.csv", float_format="%.1f")

2. 转换为Decimal类型存储(彻底解决浮点数精度问题)

如果需要严格的十进制精度,可以使用decimal模块将数值转为Decimal类型后再保存:

from decimal import Decimal, ROUND_HALF_UP

# 定义四舍五入函数
def round_decimal(x):
    return Decimal(str(x)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)

# 对DataFrame的数值列应用转换
df = df.applymap(round_decimal)
# 保存CSV
df.to_csv("output.csv")

3. 确保四舍五入操作生效

务必将round的结果重新赋值给原DataFrame,否则原数据不会被修改:

# 错误写法:仅调用round但不赋值,原df不变
# df.round(1)
# 正确写法:赋值覆盖原DataFrame
df = df.round(1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:41:33