【发布时间】:2021-07-01 18:49:49
【问题描述】:
我是一位经验丰富的 R 用户,几天以来我一直在尝试自学 Python3。 Python 处理浮点数的方式一开始让我很困惑。例如,
print(1.1+2.2==3.3)
将返回False。我知道我可以通过使用 decimal 模块来解决 Python 如何解释浮点数的这个“问题”。
import decimal as d
print(d.Decimal("1.1")+d.Decimal("2.2")==d.Decimal("3.3"))
将返回True,这正是我想要的。
但这如何与变量或其他函数一起工作?例如,我想计算以下矩阵的行列式:
import numpy as np
from numpy import linalg
A = np.array([[1,2],[3,4]])
Det_A = np.linalg.det(A)
print(Det_A)
结果是-2.0000000000000004,但我希望结果正好是-2。我该怎么做?
请原谅我的语言不精确,我不是计算机科学家。欢迎任何建议。
【问题讨论】:
-
你可以在这里使用
round() -
见Is floating point math broken? 简短的回答是,你不能。
-
1.1+2.2 == 3.3是False是标准浮点问题。它根本不是特定于 Python 的。如果您在 C 或任何其他使用 IEEE 浮点的语言中尝试过它,您可能会看到同样的结果。通常,比较浮点数是否相等是没有意义的。 -
我不认为浮点是问题,我也不认为使用十进制包是你想要的。问题是您没有正确使用浮点数。在浮点数中,您想要的不是比较
a + b == c,而是abs(a + b - c) <= epsilon用于一些小的epsilon。相等比较通常不会经常出现,但当它们出现时,您需要考虑误差范围。 -
@TomKarzes
epsilon有更好的选择:见What is the best way to compare floats for almost-equality in Python?
标签: python floating-point determinants