奇怪的行为结果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”。
我想我是盲目的,因为这不应该是复杂的。
这是极有可能发生,因为变量的类型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)
...
如果你可以解释乳清'1E-8',我们将很乐意学习 –
这是科学计数法中的0.000000001 –
@dasblinkenlight:谢谢你的解释。我问** **,因为我知道这一点。 :p –
http://stackoverflow.com/questions/10334688/how-dangerous即它比较浮点值 –
尝试将浮点数转换为int然后进行比较。因为我觉得你不打扰小数精度 –
为什么这是意想不到的?第二组日志说'actPlayerNrQ