Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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 目标-C比较浮动的If语句不起作用_Iphone_Objective C_Ios_Xcode_If Statement - Fatal编程技术网

Iphone 目标-C比较浮动的If语句不起作用

Iphone 目标-C比较浮动的If语句不起作用,iphone,objective-c,ios,xcode,if-statement,Iphone,Objective C,Ios,Xcode,If Statement,这简直是我遇到过的最奇怪的事情。因此,我有一个名为ratingDecimal的浮点,我使用一些条件来比较它。以下是条件的情况: if (ratingDecimal >= 0.0) { if (ratingDecimal < 0.3 && ratingDecimal != 0.3) { ratingDecimal = 0.0; NSLog(@"bigger or equal to 0 and smaller than

这简直是我遇到过的最奇怪的事情。因此,我有一个名为
ratingDecimal
的浮点,我使用一些条件来比较它。以下是条件的情况:

    if (ratingDecimal >= 0.0) {

    if (ratingDecimal < 0.3 && ratingDecimal != 0.3) {

        ratingDecimal = 0.0;

        NSLog(@"bigger or equal to 0 and smaller than 0.3");
    }
}

if (ratingDecimal >= 0.3) {

    if (ratingDecimal < 0.8 && ratingDecimal != 0.8) {

        ratingDecimal = 0.5;

        NSLog(@"middle");
    }
}

if (ratingDecimal >= 0.8) {

    NSLog(@"bigger or equal to 0.8");

    ratingDecimal = 1.0;
}
但我不明白

大于或等于0.8

你可能想知道为什么我的情况如此乏味和复杂,它们可以简单到:

if (ratingDecimal >= 0.3  < 0.8)
if(ratingDecimal>=0.3<0.8)
他们过去是这样的,但由于这从来没有起过作用,我一直在打破这种说法,它仍然表现得很奇怪

为什么会这样

下面是一个图像示例:


您的
分级十进制值可能类似于0.7999999999。当打印到控制台时,可能有东西将其四舍五入到0.8,但比较结果仍然认为它小于0.8


这是由于浮点数的二进制性质造成的。有关这方面的详细信息,请参阅。

您的
ratingDecimal
值可能类似于0.7999999999。当打印到控制台时,可能有东西将其四舍五入到0.8,但比较结果仍然认为它小于0.8


这是由于浮点数的二进制性质造成的。有关这方面的详细信息,请参阅。

@Greg给出了一个很好的答案。我想指出的是,您可以以更清晰、更简单的方式编写代码:

if (ratingDecimal >= 0.0) {
    if (ratingDecimal < 0.3) {
        ratingDecimal = 0.0;

        NSLog(@"bigger or equal to 0 and smaller than 0.3");
    } else if (ratingDecimal < 0.8) {
        ratingDecimal = 0.5;

        NSLog(@"middle");
    } else {
        ratingDecimal = 1.0;

        NSLog(@"bigger or equal to 0.8");
    }
} else {
    // negative
}
if(ratingDecimal>=0.0){
if(额定小数<0.3){
比率十进制=0.0;
NSLog(@“大于或等于0且小于0.3”);
}否则如果(额定小数<0.8){
比率小数=0.5;
NSLog(@“中”);
}否则{
比率十进制=1.0;
NSLog(@“大于或等于0.8”);
}
}否则{
//否定的
}
作为FYI-一条线,例如:

if (ratingDecimal < 0.3 && ratingDecimal != 0.3) {
if(ratingDecimal<0.3&&ratingDecimal!=0.3){

没有这样的意义。如果一个数字小于0.3,那么它必须不等于0.3,所以第二次检查没有任何用处。

@Greg给出了一个很好的答案。我想指出的是,您可以用更清晰、更简单的方式编写代码:

if (ratingDecimal >= 0.0) {
    if (ratingDecimal < 0.3) {
        ratingDecimal = 0.0;

        NSLog(@"bigger or equal to 0 and smaller than 0.3");
    } else if (ratingDecimal < 0.8) {
        ratingDecimal = 0.5;

        NSLog(@"middle");
    } else {
        ratingDecimal = 1.0;

        NSLog(@"bigger or equal to 0.8");
    }
} else {
    // negative
}
if(ratingDecimal>=0.0){
if(额定小数<0.3){
比率十进制=0.0;
NSLog(@“大于或等于0且小于0.3”);
}否则如果(额定小数<0.8){
比率小数=0.5;
NSLog(@“中”);
}否则{
比率十进制=1.0;
NSLog(@“大于或等于0.8”);
}
}否则{
//否定的
}
作为FYI-一条线,例如:

if (ratingDecimal < 0.3 && ratingDecimal != 0.3) {
if(ratingDecimal<0.3&&ratingDecimal!=0.3){

没有这样的意义。如果一个数字小于0.3,那么它必须不等于0.3,所以第二次检查没有任何用处。

您可以根据需要使用像roundf()这样的函数。

您可以根据需要使用像roundf()这样的函数。

这也是很难获得
3*(1/3)的原因
等于十进制中的
1
。当乘以
3
时,没有固定长度的十进制值给出
1
。在大多数固定长度十进制系统中
3*(1/3)
将打印为
1
,但在内部为
.999999..
,因此也将测试为小于1。这与很难获得
3*(1/3)的原因相同
等于十进制中的
1
。当乘以
3
时,没有固定长度的十进制值给出
1
。在大多数固定长度十进制系统中
3*(1/3)
将被打印为
1
,但在内部是
.999999..
,因此也将测试为小于1。我知道,在我的问题中,我说我之所以这样做的唯一原因是为了打破if语句,并100%确保我做对了我知道,在我的问题中,我说我之所以这样做的唯一原因是为了打破if语句陈述并确保100%正确如果ratingDecimal<0.3,则检查ratingDecimal!=0.3没有意义。它必须不同于0.3。如果ratingDecimal<0.3,则检查ratingDecimal!=0.3没有意义。它必须不同于0.3。