比较NSNumbers

时间:2012-08-15 19:59:34

标签: iphone objective-c cocoa-touch nsnumber

用户输入一个数字(浮点数或整数),并且必须大于下限。

这是从UITextField获取号码的代码:

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber *currentNumber = [f numberFromString:self.textfield.text];
[f release];

下限通常为0.1(lowerBound是NSNumber)

如果我有此代码并在文本字段中输入0.1,则isValid仍为YES

BOOL isValid = YES;
if ([currentNumber floatValue] < [self.lowerBound floatValue]) {
    isValid = NO;
}

但是我会做得更好:

BOOL isValid = YES;
if ([currentNumber compare:self.lowerBound] == NSOrderedAscending) {
    isValid = NO;
}

但是我再次输入0.1(并且lowerBound仍为0.1)if语句的计算结果为true(就好像currentNumber小于self.lowerBound)。

代码按预期工作0.11及以上。我也有一个更高的界限:

BOOL isValid = YES;
if ([currentNumber compare:self.higherBound] == NSOrderDescending) {
    isValid = NO;
}

这可以按预期工作,包括当我输入与highBound相同的值时(大多数情况下为10)

据我所知,NSNumber上的compare:方法比较了值而不是对象的地址,为什么它不能在下界工作呢?

1 个答案:

答案 0 :(得分:2)

因为浮点数不准确 - 一个NSNumber中的0.1可能与另一个NSNumber中的值不同。