处理 Python3 中的浮点数

Handling floating-point numbers in Python3

我是一位经验丰富的 R 用户,几天以来我一直在尝试自学 Python3。 Python 处理浮点数的方式一开始让我很困惑。例如,

print(1.1+2.2==3.3)

将returnFalse。我知道我可以解决这个“问题”Python 如何使用十进制模块解释浮点数。

import decimal as d
print(d.Decimal("1.1")+d.Decimal("2.2")==d.Decimal("3.3"))

将 return 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。我该怎么做?

请原谅我不严谨的语言,我不是计算机科学家。欢迎任何建议。

您的应用程序可以强制转换为整数吗? print(int(Det_A)) 或只打印小数点后 2 位数字print({:.2f}".format(Det_A))

SciPy 似乎能够比 NumPy 更准确地计算行列式。例如:

import numpy as np
from scipy import linalg

A = np.array([[1,2],[3,4]], dtype=float)

print(np.linalg.det(A))  # => -2.0000000000000004
print(linalg.det(A))     # => -2.0

我不确定这在一般情况下是否属实,但使用 SciPy 版本 因此这在可能的情况下似乎是合理的。例如。如果你正在制作一个 Docker 容器并且引入 SciPy 的唯一原因是为了获得更准确的行列式那么我不会这样做,但是当在本地工作或者如果使用更多功能那么它是可能值得使用 SciPy.

另请注意,R 在使用浮点数学时遇到相同的问题,例如,在 R 中输入 1.1 + 2.2 == 3.3 时,我得到 FALSE 返回。这可以通过计算 [=13] 来确认=],在 R 中输出:

4.440892e-16

而 Python 给出:

4.440892098500626e-16

这些是相同的值,只是 Python 显示结果更精确。