1

这实际上是我遇到过的最奇怪的事情。所以,我有一个浮点数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)

他们曾经是这样的,但由于这从来没有奏效,我一直在打破这个声明,它仍然表现得很奇怪。

为什么会这样!?

这是一个图像示例:

问题

4

3 回答 3

7

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

这是由于浮点数的二进制性质。有关这方面的大量信息,请参阅每位计算机科学家应该了解的关于浮点运算的知识。

于 2012-10-15T01:17:01.320 回答
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
}

作为一个仅供参考 - 一条线,如:

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

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

于 2012-10-15T01:38:15.663 回答
0

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

于 2012-10-15T08:06:08.113 回答