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

MCK*_*pur 1 iphone xcode if-statement objective-c ios

这实际上是我遇到过的最奇怪的事情.所以,我有一个浮动调用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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个奇怪的问题.我已将设置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;

}
Run Code Online (Sandbox Code Playgroud)

但我没有看到

大于或等于0.8

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

if (ratingDecimal >= 0.3  < 0.8)
Run Code Online (Sandbox Code Playgroud)

他们曾经是那样的但是因为这从来没有奏效过,所以我一直在打破声明并且仍然表现得很奇怪.

为什么会这样?!?

这是一个图像示例:

问题

Gre*_*ill 7

你的ratingDecimal价值可能是0.7999999999999.当打印到控制台时,某些东西可能会将其四舍五入为0.8,但比较仍然认为它小于0.8.

这是由于浮点数的二元性质.请参阅每个计算机科学家应该知道的关于浮点算术的内容,以获取有关此内容的详尽信息.

  • 同样的原因是很难让"3*(1/3)"在十进制中等于"1".没有固定长度的十进制值,当乘以"3"时给出"1".在大多数固定长度的十进制系统中,`3*(1/3)`将打印为`1`但内部为.999999 ...`因此也将测试小于1. (3认同)