Python 浮点数(float)类型详解
在Python中,浮点数(float
)类型用于表示带有小数部分的数字。尽管它们看起来简单直接,但浮点数在计算机内部的表示方式导致了一些独特的行为和需要注意的地方。
1. 浮点数基础
1.1 浮点数表示
Python使用IEEE 754双精度浮点数(64位):
a = 3.14
b = 1.23e-4 # 科学计数法 0.000123
c = float('inf') # 无穷大
d = float('nan') # 非数字
1.2 类型检查
type(3.14) # <class 'float'>
isinstance(3.14, float) # True
2. 底层实现
2.1 IEEE 754双精度格式
- 1位符号位
- 11位指数位(偏移量1023)
- 52位尾数位(隐含前导1)
- 范围:约 ±1.8×10³⁰⁸
- 精度:约15-17位有效数字
2.2 内存表示
import sys
sys.getsizeof(3.14) # 24字节(Python对象开销+8字节数据)
2.3 特殊值
float('inf') # 正无穷
float('-inf') # 负无穷
float('nan') # 非数字
math.isinf(1e308 * 10) # True
math.isnan(float('nan')) # True
3. 浮点运算特性
3.1 精度问题
0.1 + 0.2 == 0.3 # False
print(0.1 + 0.2) # 0.30000000000000004
3.2 解决方案
# 方法1:允许误差范围
abs(0.1 + 0.2 - 0.3) < 1e-10 # True# 方法2:使用decimal模块
from decimal import Decimal
Decimal('0.1') + Decimal('0.2') == Decimal('0.3') # True
4. 数学运算
4.1 基础运算
3.14 + 2.71 # 5.85
3.14 - 2.71 # 0.43
3.14 * 2.0 # 6.28
3.14 / 2.0 # 1.57
3.14 // 2.0 # 1.0 (地板除)
3.14 % 2.0 # 1.14
3.14 ** 2.0 # 9.8596
4.2 数学函数
import math
math.sqrt(2.0) # 1.4142135623730951
math.sin(math.pi) # 1.2246467991473532e-16 (近似0)
math.floor(3.99) # 3
math.ceil(3.01) # 4
math.isclose(0.1+0.2, 0.3) # True
5. 高级特性
5.1 浮点数解析
float.fromhex('0x1.ffffp10') # 2047.984375
3.14.hex() # '0x1.91eb851eb851fp+1'
5.2 浮点数精度控制
# 使用round函数
round(3.1415926, 4) # 3.1416# 格式化输出
format(3.1415926, '.4f') # '3.1416'
f"{3.1415926:.4f}" # '3.1416'
6. 性能优化
6.1 避免重复计算
# 较差
for x in data:y = math.sin(x) * 10# 较好
sin = math.sin
for x in data:y = sin(x) * 10
6.2 使用math模块
# 比内置运算符更快
math.fsum([0.1]*10) # 更精确的求和
7. 特殊场景处理
7.1 大数相加
# 可能丢失精度
1e20 + 1 == 1e20 # True# 解决方案
math.fsum([1e20, 1]) # 1e20 + 1 = 1e20 (仍无法解决)
7.2 比较浮点数
# 错误方式
a = 0.1 + 0.2
b = 0.3
a == b # False# 正确方式
math.isclose(a, b) # True
abs(a - b) < 1e-9 # True
8. 扩展应用
8.1 科学计算
import numpy as np
np.float64(3.14) # 更精确的64位浮点
8.2 金融计算
from decimal import Decimal, getcontext
getcontext().prec = 6
Decimal(1) / Decimal(7) # Decimal('0.142857')
9. 安全注意事项
9.1 避免精度丢失
# 大数加小数
(1e20 + -1e20) + 1 # 1.0
1e20 + (-1e20 + 1) # 0.0
9.2 输入验证
try:x = float(user_input)
except ValueError:print("Invalid float")