Objective-C如果语句比较浮点数不起作用

时间:2012-10-15 01:13:24

标签: 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 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;
}

这是一个奇怪的问题。我已将ratingDecimal设置为0.8,控制台将ratingDecimal设置为:

  

0.8

但是打电话:

  

中间

只有当ratingDecimal大于或等于0.3但小于0.8且不等于0.8时才应调用。

应该调用的声明是:

if (ratingDecimal >= 0.8) {

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

ratingDecimal = 1.0;

}

但我没看到

  

大于或等于0.8

您可能想知道为什么我的条件如此繁琐复杂,它们可以如此简单:

if (ratingDecimal >= 0.3  < 0.8)

他们曾经是这样的,但由于这从未奏效,我继续打破声明,但仍然表现得很奇怪。

为什么会这样?!

以下是图片示例:

PROBLEM

3 个答案:

答案 0 :(得分:7)

您的ratingDecimal值可能类似于0.7999999999999。当打印到控制台时,可能会将其四舍五入为0.8,但比较仍然将其视为小于0.8。

这是由于浮点数的二元性质。有关详细信息,请参阅What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:1)

@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
}

作为一个FYI - 如下的一行:

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

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

答案 2 :(得分:0)

您可以根据需要使用roundf()等函数。