奇怪的行为结果if语句

问题描述:

我有以下代码:奇怪的行为结果if语句

- (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即它比较浮点值 –

+0

尝试将浮点数转换为int然后进行比较。因为我觉得你不打扰小数精度 –

+0

为什么这是意想不到的?第二组日志说'actPlayerNrQ

这是极有可能发生,因为变量的类型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 –