比较两个十进制数

时间:2013-09-02 16:19:26

标签: iphone objective-c

我在将双倍值与诸如“5.5”之类的值进行比较时遇到了麻烦。在我的代码中,我有以下内容:

if (j==5.5f) {
        //do something
    }

当我运行代码并使用nslog打印j和5.5f值的值时,我得到完全相同的值。但是,代码不会输入if语句。这有什么不对?

3 个答案:

答案 0 :(得分:2)

1)第一个double与float不同,因此对于常量,你应该删除常量中的'f',所以使用:     5.5而不是5.5f(默认情况下常量是double)

2)因为浮点数没有精确的表示,为了比较其中两个你必须使用一个阈值

所以用条件替换条件:

#include <math.h>

static double threshold = 1e-10
if (fabs(j-5.5) < threshold) { // dont use the f for the literal 
}

答案 1 :(得分:1)

这可能是一个浮点精度问题。通常,由于浮点值通常不是精确表示,因此您需要比较范围,例如:

if (abs (j - 5.5) < epsilon)
{
    ... do your work....
}

这表示如果jepsilon的5.5之内,那就做点什么吧。 epsilon的值将是application-depenendent。

答案 2 :(得分:0)

浮点数的实现在尝试比较时会产生一个非常常见的精度问题,因为它们不是作为普通整数实现的。两个看起来相同的浮点数之间的差异可能非常小,因此您需要定义某种阈值或epsilon值,如前所述,在比较两个浮点数时必须使用这些值。

这是一个非常好的代码实践,永远不会将浮点数或双精度数与'=='等式进行比较,并始终使用已经显示的阈值或内置函数用于此目的,无论平台,编译器,语言管他呢。 (比较字符串也是如此)