python 浮点数无法精确表示

如何解释下面的执行结果为False?( )

1

print(1.2- 1.0== 0.2)

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
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务