Python3浮点数精度问题及numpy行列式计算精确值获取方法
问题本质
你遇到的是IEEE 754标准二进制浮点数的固有精度误差,这类问题在所有采用该标准的编程语言(包括R)中都存在,只是R的默认打印配置会默认隐藏微小尾差,所以你之前感知不强。
常用解决方案
根据你的使用场景,可以选择以下几种处理方式:
1. 数值近似比较
如果只是需要判断两个浮点数是否相等,不需要完全精确的存储值,用内置的近似比较函数即可:
- 普通Python数值用
math.isclose:
import math print(math.isclose(1.1+2.2, 3.3)) # 返回True
- Numpy数值用
np.isclose:
import numpy as np A = np.array([[1,2],[3,4]]) Det_A = np.linalg.det(A) print(np.isclose(Det_A, -2)) # 返回True
2. 结果精度修整
如果你明确知道计算结果的精度要求(比如示例中行列式结果一定是整数),可以直接对结果做修整:
import numpy as np A = np.array([[1,2],[3,4]]) Det_A = np.linalg.det(A) # 四舍五入到整数 rounded_det = round(Det_A) print(rounded_det) # 输出-2
如果只是需要打印效果整洁,不需要修改存储值,可以调整numpy的打印配置:
np.set_printoptions(precision=4) print(Det_A) # 输出-2.
3. 完全精确的代数计算
如果需要无误差的精确计算结果,改用符号计算库sympy实现,完全规避浮点数误差:
from sympy import Matrix A = Matrix([[1,2],[3,4]]) Det_A = A.det() print(Det_A) # 直接输出整数-2,无任何精度误差
内容的提问来源于stack exchange,提问作者Count
相关产品推荐
相关产品推荐

