Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 比较两个十进制数_Iphone_Objective C - Fatal编程技术网

Iphone 比较两个十进制数

Iphone 比较两个十进制数,iphone,objective-c,Iphone,Objective C,我很难将双精度值与“5.5”等值进行比较。在我的代码中,我有以下内容: if (j==5.5f) { //do something } 当我运行代码并使用nslog打印j和5.5f的值时,我得到了完全相同的值。但是,代码没有输入if语句。这里出了什么问题?这可能是浮点精度问题。通常,由于浮点值通常不是精确的表示形式,因此需要比较一个范围,例如: if (abs (j - 5.5) < epsilon) { ... do your work.... } i

我很难将双精度值与“5.5”等值进行比较。在我的代码中,我有以下内容:

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

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

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

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

这意味着如果
j
在5.5的
epsilon
范围内,那么做些什么。epsilon的值取决于应用程序。

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

if (abs (j - 5.5) < epsilon)
{
    ... do your work....
}
if(abs(j-5.5)
这意味着如果
j
在5.5的
epsilon
范围内,那么做些什么。epsilon的值取决于应用程序。

1)first double不同于float,因此对于常量,您应该删除常量中的“f”,因此使用: 5.5而不是5.5f(默认情况下常数为双倍)

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

因此,将条件替换为:

#include <math.h>

static double threshold = 1e-10
if (fabs(j-5.5) < threshold) { // dont use the f for the literal 
}
#包括
静态双阈值=1e-10
如果(fabs(j-5.5)
1)第一个双精度与浮点不同,因此对于常数,应删除常数中的“f”,因此使用: 5.5而不是5.5f(默认情况下常数为双倍)

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

因此,将条件替换为:

#include <math.h>

static double threshold = 1e-10
if (fabs(j-5.5) < threshold) { // dont use the f for the literal 
}
#包括
静态双阈值=1e-10
如果(fabs(j-5.5)
浮点数的实现在进行比较时会带来一个非常常见的精度问题,因为它们不是作为普通整数实现的。两个看起来相等的浮点数之间的差值可能非常小,因此您需要定义某种阈值或ε值,如前所述,在比较两个浮点数时必须使用这些阈值或ε值


这是一个非常好的代码实践,从不将浮点或双精度与“==”等式进行比较,始终使用已显示的阈值或内置函数,无论是平台、编译器、语言还是其他。(比较字符串也是如此)

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


这是一个非常好的代码实践,从不将浮点或双精度与“==”等式进行比较,始终使用已显示的阈值或内置函数,无论是平台、编译器、语言还是其他。(比较字符串也是如此)

不确定,但尝试使用NSnumber<代码>NSNumber*num=[NSNumber numberWithFloat:5.5f]//j如果([num isEqualToNumber:otherNum]){//do something}
首先必须定义“十进制数”的含义。Objective-C支持的唯一“十进制”是NSDecimalNumber。如果您只是指一个数字,在显示时可能以十进制表示,则必须定义它是整数还是浮点值。如果它是一个浮点值,那么您必须注意一个事实,即浮点pont数通常并不精确,因此与
==
进行比较通常是一个坏主意。不确定,但尝试使用NSnumber代替<代码>NSNumber*num=[NSNumber numberWithFloat:5.5f]//j如果([num isEqualToNumber:otherNum]){//do something}
首先必须定义“十进制数”的含义。Objective-C支持的唯一“十进制”是NSDecimalNumber。如果您只是指一个数字,在显示时可能以十进制表示,则必须定义它是整数还是浮点值。如果它是一个浮点值,那么您必须注意一个事实,即浮点pont数通常并不精确,因此与
==
比较通常是一个坏主意。谢谢,它起到了作用!我会将其添加到小部件便笺中,以始终记住;)谢谢,成功了!我会将其添加到小部件便笺中,以始终记住;)