python - 比较 Python 中的圆形 float

标签 python floating-point comparison

我知道通常两个 float 必须像 abs(f1-f2) < 1e-6 一样进行比较,但是如果在比较之前对它们进行四舍五入,在 Python 中比较它们的四舍五入值是否安全?

if round(f1,5)==round(f2,5):
    print "equal"
else
    print "unequal"

谢谢

最佳答案

首先,没有必要像您建议的那样比较两个具有误差容限的 float 。两个 float 之间的关系取决于它们是如何导出的,并且在应用程序之间差异很大。这个没有统一的答案。

其次,当且仅当值相等时,两个舍入值的相等比较将返回 true。允许任何类型的公差获得“近似等于”函数将没有任何效果(如果公差小于舍入距离)。

但是,在 float 中舍入值是有问题的,因为小错误可能会将值从舍入点的一侧移动到另一侧。例如,考虑将 f1 舍入到最接近的整数,其中 f1 是您使用包含舍入误差的浮点运算计算出的某个值。 (当运算的数学结果不能精确表示时会出现舍入错误,因此计算机必须将其舍入到最接近的可表示结果。)如果 f1 非常接近,比如 2.5,它应该是什么轮到?显然,如果小于2.5,则四舍五入为2,如果大于,则四舍五入为3。但假设f1的理想值,用精确的数学计算,稍微大一点小于 2.5,但由于舍入误差,计算值略小于 2.5。然后 f1 将四舍五入为 2,但我们更希望它四舍五入为 3。

同时,假设您有一个正确舍入为 3 的 f2。如果您将舍入的 f1 与舍入的 f2 进行比较, 它们将不相等。

因此,您对数字进行四舍五入后,再考虑其中可能存在的错误为时已晚;该信息消失了。比较四舍五入后的数字并不能告诉您精确的数学结果在四舍五入之前是否彼此接近。

此问题的解决方案取决于您的特定应用程序以及数字的计算方式。没有通用的解决方案。

关于python - 比较 Python 中的圆形 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14083015/

相关文章:

python - wxPython wxScrolledWindow 函数引发 TypeError

c++ - 浮点平方根算法

set - perl 6 集合操作中用户定义的比较函数

python - 使用 Fibonacci 最小堆的 dijkstra 的时间复杂度

python - python3中十六进制的解码列表

c++ - 如何将整数转换为 float 并向零舍入?

python - 如何比较python中的两个百分比?

sql - 在非过程语言中,什么规定了如何做事?

python - 将纹理映射到网格时,Vtk 在节点之间插入不正确的颜色

python - 如何在字符串(单元格)数组中查找字符,Python