python 浮点数无法精确表示
如何解释下面的执行结果为False?( )
1 |
|
A Python的实现有错误
B 浮点数无法精确表示
C 布尔运算不能用于浮点数比较
D Python将非0数视为False
修改版本如下:
方案一:使用 math.isclose()(Python 3.5+ 推荐)
这是最简洁、最符合Python风格的方式。
python
import math # 默认相对容差为 1e-9,绝对容差为 0.0 print(math.isclose(1.2 - 1.0, 0.2)) # True # 也可自定义容差 print(math.isclose(1.2 - 1.0, 0.2, rel_tol=1e-9, abs_tol=1e-12)) # True
方案二:自定义容差比较
如果您需要兼容旧版本Python或想要更直观的控制,可以手动计算差值。
python
# 方法1:绝对误差比较
def float_equal_abs(a, b, epsilon=1e-10):
return abs(a - b) < epsilon
print(float_equal_abs(1.2 - 1.0, 0.2)) # True
# 方法2:相对误差比较(更科学)
def float_equal_rel(a, b, rel_tol=1e-9):
return abs(a - b) <= max(abs(a), abs(b)) * rel_tol
print(float_equal_rel(1.2 - 1.0, 0.2)) # True
方案三:使用 decimal 模块进行精确计算
如果涉及金融等需要精确计算的场景,可以使用 decimal 模块。
python
from decimal import Decimal
# 使用字符串初始化Decimal以避免浮点误差
result = Decimal('1.2') - Decimal('1.0')
print(result == Decimal('0.2')) # True
# 注意:不要用浮点数初始化Decimal
result2 = Decimal(1.2) - Decimal(1.0)
print(result2 == Decimal(0.2)) # False!因为1.2本身已有误差
方案四:使用 numpy(科学计算常用)
如果您已经在使用NumPy进行数值计算,可以使用其提供的函数。
python
import numpy as np # numpy的isclose函数 print(np.isclose(1.2 - 1.0, 0.2)) # True # allclose用于数组比较 arr1 = np.array([1.2 - 1.0, 2.0 - 1.5]) arr2 = np.array([0.2, 0.5]) print(np.allclose(arr1, arr2)) # True
查看15道真题和解析