首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第7章 编程术语
7.1 编程术语定义
7.1.1 作为语言的Python和作为解释器的Python
7.1.2 垃圾回收
7.1.3 字面量
7.1.4 关键字
7.1.5 对象、值、实例和身份
7.1.6 项
7.1.7 可变和不可变
7.1.8 索引、键和哈希值
7.1.9 容器、序列、映射和集合类型
7.1.10 特殊方法
7.1.11 模块和包
7.1.12 可调用对象和头等对象
7.2 经常被混淆的术语
7.2.1 语句和表达式
7.2.2 块、子句和主体
7.2.3 变量和特性
7.2.4 函数和方法
7.2.5 可迭代对象和迭代器
7.2.6 语法错误、运行时错误和语义错误
7.2.7 形参和实参
7.2.8 显式类型转换和隐式类型转换
7.2.9 属性和特性
7.2.10 字节码和机器码
7.2.11 脚本和程序,以及脚本语言和编程语言
7.2.12 库、框架、SDK、引擎、API
第8章 常见的Python陷阱
8.1 循环列表的同时不要增删其中的元素
8.2 复制可变值时务必使用copy.copy()和copy.deepcopy()
8.3 不要用可变值作为默认参数
8.4 不要通过字符串连接创建字符串
8.5 不要指望sort()按照字母顺序排序
8.6 不要假设浮点数是完全准确的
8.7 不要使用链式!=运算符
8.8 不要忘记在仅有一项的元组中添加逗号
第9章 Python的奇特难懂之处
9.1 为什么256 是256,而257 不是257
9.2 字符串驻留
9.3 假的Python 增量运算符和减量运算符
9.4 传递空列表给all()
9.5 布尔值是整数值
9.6 链式使用多种运算符
9.7 Python 的反重力特性
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(三)
小册名称:Python编程轻松进阶(三)
### 8.6 不要假设浮点数是完全准确的 在编程的广阔天地中,尤其是在使用Python这类高级编程语言进行数值计算时,浮点数(Floating-Point Numbers)的精确性往往是一个容易被忽视但又极其重要的议题。Python中的浮点数遵循IEEE 754标准,这一标准定义了如何在计算机中表示浮点数,尽管它极大地扩展了数值的表示范围,但同时也引入了精度限制和舍入误差的问题。因此,在编写涉及浮点运算的代码时,我们必须铭记于心:**不要假设浮点数是完全准确的**。本章将深入探讨这一话题,从浮点数的表示原理、常见问题、到应对策略,为Python编程的进阶之路铺平道路。 #### 8.6.1 浮点数的表示原理 要理解浮点数的精度问题,首先需要了解其背后的表示原理。IEEE 754标准将浮点数分为三部分来表示:符号位(S)、指数位(E)和尾数位(M),也称为有效数字位或尾数。一个浮点数可以表示为: $$ \text{Value} = (-1)^S \times M \times 2^{E-1023} $$ (对于双精度浮点数,指数偏移量为1023;对于单精度,偏移量为127) - **符号位**(S):0表示正数,1表示负数。 - **指数位**(E):用于表示浮点数的范围,通过偏移量进行调整以表示正负指数。 - **尾数位**(M):存储有效数字的二进制表示,且总是以1开头(在IEEE 754标准中,这个隐含的1不直接存储在尾数位中,从而节省了一位存储空间)。 由于尾数位的长度有限(双精度为52位,单精度为23位),因此无法精确表示所有小数,特别是那些无法精确转换为有限二进制小数的十进制小数(如0.1)。这种表示方式导致了浮点数的精度限制。 #### 8.6.2 常见问题示例 1. **简单的加法不精确**: ```python >>> 0.1 + 0.2 0.30000000000000004 ``` 这个看似简单的加法运算,结果却并非我们期望的0.3,而是稍微大了一点的数。这是因为0.1和0.2在二进制中都无法精确表示,导致相加时产生了累积误差。 2. **比较浮点数**: 直接比较两个浮点数是否相等,往往不是一个好的做法,因为即使理论上相等的两个数,在实际的二进制表示中也可能因为精度问题而略有差异。 3. **金融计算中的精度问题**: 在金融领域,微小的误差也可能导致巨大的财务损失。因此,在处理金融数据时,通常使用专门的库(如Python的`decimal`模块)来避免浮点数带来的精度问题。 #### 8.6.3 应对策略 面对浮点数的精度问题,我们可以采取以下几种策略来减少其影响: 1. **使用`decimal`模块**: 对于需要高精度计算的场景,Python的`decimal`模块提供了`Decimal`数据类型,它可以精确地表示小数,并且支持自定义精度和舍入模式。 ```python from decimal import Decimal a = Decimal('0.1') b = Decimal('0.2') print(a + b) # 输出:0.3 ``` 2. **设置合理的误差范围**: 在比较浮点数时,可以设定一个合理的误差范围,判断两个数是否“足够接近”,从而视为相等。 ```python def is_close(a, b, tol=1e-9): return abs(a - b) < tol print(is_close(0.1 + 0.2, 0.3)) # 输出:True ``` 3. **避免不必要的浮点数运算**: 在设计算法时,尽量通过数学变换减少浮点数运算的次数,或者使用整数运算代替浮点数运算,尤其是在循环和递归中。 4. **了解并接受精度限制**: 对于某些应用场景,了解并接受浮点数的精度限制是不可避免的。在文档或注释中明确指出这一点,可以帮助其他开发者更好地理解和使用你的代码。 5. **使用专业库**: 对于特定领域(如科学计算、工程仿真、金融分析等),使用专门为这些领域设计的库(如NumPy、SciPy、Pandas等)可以大大简化高精度计算的过程,并减少因浮点精度问题导致的错误。 #### 8.6.4 结论 浮点数在计算机科学中扮演着至关重要的角色,但其精度限制和舍入误差也是不可忽视的问题。在Python编程中,特别是在处理需要高精度计算的场景时,我们必须时刻牢记:不要假设浮点数是完全准确的。通过了解浮点数的表示原理、识别常见问题、并采取适当的应对策略,我们可以有效地减少因浮点精度问题带来的困扰,编写出更加健壮、可靠的代码。随着Python在各个领域应用的不断深入,掌握这些技巧将对我们的技术成长产生深远的影响。
上一篇:
8.5 不要指望sort()按照字母顺序排序
下一篇:
8.7 不要使用链式!=运算符
该分类下的相关小册推荐:
实战Python网络爬虫
Python机器学习实战
Python面试指南
Python爬虫入门与实战开发(上)
Python合辑14-面向对象编程案例(下)
Python合辑5-格式化字符串
Python3网络爬虫开发实战(上)
Python机器学习基础教程(下)
Python合辑4-130个字符串操作示例
Python合辑12-面向对象
Python合辑11-闭包函数
Python合辑13-面向对象编程案例(上)