繁体   English   中英

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

[英]Objective-C If Statement Comparing Floats not working

从字面上看,这是我遇到过的最奇怪的事情。 因此,我有一个称为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 ratingDecimal等于0.8时才应调用ratingDecimal方法。

应该被调用的语句是:

if (ratingDecimal >= 0.8) {

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

ratingDecimal = 1.0;

}

但是我看不到

大于或等于0.8

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

if (ratingDecimal >= 0.3  < 0.8)

他们曾经是那样,但是由于这从未奏效,所以我一直坚持不懈地声明,这仍然很奇怪。

为什么会这样呢?

这是一个图像示例:

问题

您的ratingDecimal值可能类似于0.7999999999999。 当打印到控制台上时,可能会将其四舍五入为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.3 && ratingDecimal != 0.3) {

没道理。 如果数字小于0.3,则它必须不等于0.3,因此第二次检查没有任何用处。

您可以根据需要使用诸如roundf()之类的函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM