我在将双倍值与诸如“5.5”之类的值进行比较时遇到了麻烦。在我的代码中,我有以下内容:
if (j==5.5f) {
//do something
}
当我运行代码并使用nslog打印j和5.5f值的值时,我得到完全相同的值。但是,代码不会输入if语句。这有什么不对?
答案 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....
}
这表示如果j
在epsilon
的5.5之内,那就做点什么吧。 epsilon
的值将是application-depenendent。
答案 2 :(得分:0)
浮点数的实现在尝试比较时会产生一个非常常见的精度问题,因为它们不是作为普通整数实现的。两个看起来相同的浮点数之间的差异可能非常小,因此您需要定义某种阈值或epsilon值,如前所述,在比较两个浮点数时必须使用这些值。
这是一个非常好的代码实践,永远不会将浮点数或双精度数与'=='等式进行比较,并始终使用已经显示的阈值或内置函数用于此目的,无论平台,编译器,语言管他呢。 (比较字符串也是如此)