比较Python中的舍入浮点数

时间:2012-12-29 15:15:33

标签: python floating-point comparison

我知道通常必须比较两个浮点数,如abs(f1-f2)< 1e-6,但是如果它们在比较之前被舍入,那么可以安全地比较它们在Python中的相等舍入值吗?

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

由于

2 个答案:

答案 0 :(得分:4)

首先,没有必要按照您的建议比较两个具有误差容限的浮点数。两个浮点数之间的关系取决于它们的派生方式,并且在应用程序之间存在巨大差异。对此没有统一的答案。

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

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

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

所以, 之后你有四舍五入的数字,现在考虑它们可能出现的错误为时已晚;那些信息消失了。四舍五入后比较数字无法告诉您在舍入之前精确的数学结果是否彼此接近。

此解决方案取决于您的特定应用以及如何计算数字。没有通用的解决方案。

答案 1 :(得分:0)

没有。 如documentation中所述,

  

对于浮点数,round()的行为可能会令人惊讶:例如,round(2.675,2)给出2.67而不是预期的2.68。

所以答案仍然是浮点数,我们can't have any guarantee on its exact value

有些例子round()返回数字,不能完全表示为浮点数,结果仍然需要使用epsilon进行正确比较(例如round() in Python doesn't seem to be rounding properly