我知道通常两个 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/