为什么Python中Pandas读取浮点数会出现精度丢失及如何解决?

夏磊姑娘_9142

夏磊姑娘_9142

2026-11-12

802人浏览

原创

df['col'] == 0.1 总是返回全 False 是因浮点数无法精确表示十进制小数,IEEE 754 存储的是近似值 0.10000000000000000555...,直接等于比较必然失败。

为什么python中pandas读取浮点数会出现精度丢失及如何解决?

为什么 df['col'] == 0.1 总是返回全 False?

这不是 Pandas 的 bug,而是浮点数在二进制中无法精确表示十进制小数(如 0.1)导致的。IEEE 754 双精度实际存储的是近似值 0.10000000000000000555...,所以用 == 直接比较几乎必然失败。

  • 所有基于 float64 的列都受此影响,包括从 CSV/Excel 读入后未指定类型的数据
  • round()、astype(int) 等操作不解决根本问题,中间仍走浮点路径,误差可能放大
  • pd.options.display.float_format 只控制显示,不影响底层值,不能用于逻辑判断

读取阶段就避免精度污染:用 dtype='string' + Decimal

对金额、坐标等关键字段,读取时就不该让 Pandas 自动转成 float。直接按字符串读入,后续按需转 Decimal。

  • 使用 pd.read_csv(..., dtype={'amount': 'string', 'lat': 'string'})
  • 之后用 df['amount'].apply(lambda x: Decimal(x) if pd.notna(x) else None) 转高精度数值
  • 注意:绝不能用 float(x) 中转,那会立刻丢失精度
  • 该方法性能较差,只适用于金融字段或中小数据集

计算和比较时别用 ==,改用 np.isclose() 或区间判断

当你必须用浮点列做筛选或断言时,绕过逐位相等比较,改用容差逻辑。

Biopython
Biopython

全面的分子生物学工具集。适用于序列操作、文件解析(FASTA/GenBank/PDB)、系统发育分析,以及通过 Bio.Entrez 以编程方式访问 NCBI/

下载
  • 筛选:用 np.isclose(df['col'], 0.1) 或 df['col'].between(0.0999999999, 0.1000000001)
  • 单元测试断言:用 pandas.testing.assert_series_equal(..., check_exact=False, atol=1e-10)
  • 归类需求(如把 0.123 映射为 “0.1”):优先用 np.round(df['col'], decimals=1),它比 Pandas 的 round() 更稳定
  • 转整数倍(如元→分):写成 (df['price'] * 100).round().astype(np.int64),避免链式 float 操作

导出 CSV 时数值变样?关键是 float_format 不等于精度修复

导出后看到 “123.456 变成 123.45600000000001”,说明底层仍是 float,只是输出没截断。

  • to_csv(..., float_format='%.2f') 只控制字符串格式,不改变数值本身
  • 若需真正保留精度导出,先转 Decimal 列,再用 astype(str) 转字符串导出
  • 或者导出前统一乘倍数转整型(如 cents),用 astype(int) 后导出,彻底避开浮点

真实精度问题从来不在“怎么显示”,而在于“怎么存”和“怎么算”。字符串读入 + Decimal 计算是最稳妥的金融路径;而大多数分析场景,接受合理容差并用 np.isclose 替代 ==,才是兼顾性能与正确的日常解法。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1911

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5324

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1849

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

32317

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3807

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3827

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1263

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2963

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程