2013-04-13 2 views
0

У меня есть следующий код:Странный результат поведения, если-заявление

- (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-заявление и "& &", так как я не ожидаю "MATCH OFF", когда он появится.

Я думаю, что я слепой, так как это не должно быть сложно.

+0

http://stackoverflow.com/questions/10334688/how-dangerous -is-it-to-compare-floating-point-values ​​ –

+0

попытаться преобразовать float в int и затем сравнить. как я чувствую, что вы не беспокоитесь о десятичных точках –

+0

Почему это неожиданно? Второй набор журналов говорит, что 'actPlayerNrQ

ответ

1

Это очень вероятно, происходит потому, что переменные типа float: даже через они оба печататься как 5, один из них может быть на самом деле немного меньше, чем другие (скажем, 4.9999999999999999). Это может произойти из-за способа вычисления actPlayerNrQ: например, если вы добавите 0.1 пятьдесят раз, вы не получите точно 5.

Здесь link to an example (он находится в C, но эта часть языка разделяется с Objective C).

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"); 

Печатается

5.000000 < 5.000000 : yes 

Чтобы исправить это, вы могли бы сравнить с эпсилон, например

#define EPSILON 1E-8 
// 1E-8 stands for 1*10^-8, or 0.00000001 
... 

if ((actPlayerNrQ - nrMatchQ) < EPSILON && (inactivePlayerNrQ - nrMatchQ) < EPSILON) 
    ... 
+0

Если вы можете объяснить сыворотку «1E-8», мы будем рады узнать, что –

+1

это 0,000000001 в научной нотации –

+0

@dasblinkenlight: Спасибо за ваше объяснение. Я спросил ** МЫ **, поскольку я знал это. : p –

Смежные вопросы