奇怪的行为结果if-statement

时间:2013-04-13 16:03:36

标签: objective-c if-statement

我有以下代码:

- (NSArray *)checkNormalGameDuelAndMatch:(float)nrDuelQs andNrQPerDuel:(float)nrQPerDuel andNrMatchQ:(float)nrMatchQ andActivePlayer:(float)actPlayerNrQ andInactivePlayer:(float)inactivePlayerNrQ {
NSLog(@"checkNormalGameDuelAndMatch:");

// Check for Matches and Duels to prep for swaps and/or match endings
NSArray *theCheckArray = [[NSArray alloc]init];
NSLog(@"nrDuelQs: %.0f / nrQPerDuel: %.0f", nrDuelQs, nrQPerDuel);
// Check if Match still on
NSLog(@"actPlayerNrQ: %.0f / inactivePlayerNrQ: %.0f / nrMatchQ: %.0f", actPlayerNrQ, inactivePlayerNrQ, nrMatchQ);
if (actPlayerNrQ < nrMatchQ && inactivePlayerNrQ < nrMatchQ) {
    // Match is still on
    _isMatchStillOn = YES;

    // Check if Duel is till on
    if (nrDuelQs < nrQPerDuel) {
        // Duel is still on
        _isDuelStillOn = YES;
        NSLog(@"_isDuelStillOn = YES;");
    }
    else {
        _isDuelStillOn = NO;
        NSLog(@"_isDuelStillOn = NO;");
    }
}
else {
    //==MATCH IS OVER==//
    _isMatchStillOn = NO;
    NSLog(@"MATCH OFF");
}

theCheckArray = @[[NSNumber numberWithBool:_isDuelStillOn], [NSNumber numberWithBool:_isMatchStillOn]];
return theCheckArray;
}

使用以下NSLog输出,在两个循环期间:

checkNormalGameDuelAndMatch:
nrDuelQs: 4 / nrQPerDuel: 5
actPlayerNrQ: 4 / inactivePlayerNrQ: 0 / nrMatchQ: 5
_isDuelStillOn = YES;
checkNormalGameDuelAndMatch:
nrDuelQs: 5 / nrQPerDuel: 5
actPlayerNrQ: 5 / inactivePlayerNrQ: 0 / nrMatchQ: 5
MATCH OFF

我猜If语句和“&amp;&amp;”有问题。因为我不期待它的“匹配”。

我想我是盲目的,因为这不应该是复杂的。

1 个答案:

答案 0 :(得分:1)

这很可能发生,因为变量属于float类型:即使它们都打印为5,其中一个实际上可能比另一个略小(例如{{1} }})。这可能是因为计算4.9999999999999999的方式:例如,如果您添加actPlayerNrQ五十次,则不会得到0.1

这是一个link to an example(它在C中,但该部分语言与Objective C共享)。

5

打印

float n = 0;
int i = 0;
for (i = 0 ; i != 25 ; i++, n += 0.2);
printf("%f < 5.000000 : %s", n, n < 5.0 ? "yes":"no");

要解决此问题,您可以与epsilon进行比较,例如

5.000000 < 5.000000 : yes