在Objective C中比较NSNumber

69

我是一个Objective-C的初学者,对于这种情况有些困惑。我有以下代码:

if (number1 < number2) {
    NSLog(@"THE FOLLOWING NUMBER ");
    NSLog(@"%@", number1);
    NSLog(@"IS LESS THAN");
    NSLog(@"%@", number2);
}

当我运行这段代码时,我看到非常奇怪的结果,就像这样:

2011-07-06 20:38:18.044 helloworld[1014:207] THE FOLLOWING NUMBER 
2011-07-06 20:38:18.047 helloworld[1014:207] 190.8776
2011-07-06 20:38:18.050 helloworld[1014:207] IS LESS THAN
2011-07-06 20:38:18.053 helloworld[1014:207] 96.75866

这两个数字都是NSNumber对象,为什么会发生这种情况?我是通过在屏幕上查找精灵之间的距离来获取这两个数字的。

如果有任何提示或建议,将不胜感激。


2
只是提醒一下,您可以通过使用NSLog(@“数字%@小于%@”,number1,number2);来组合这些NSLog - Ky -
5个回答

113
我假设number1和number2是指向对象的指针。<符号用于比较这些指针。
你需要比较实际的floatValue或doubleValue。
if ([number1 doubleValue] < [number2 doubleValue]) 

....


38
另外,您可以使用if ([number1 compare:number2] == NSOrderedAscending) - Adam Rosenfield
3
说实话,我给你点了踩是因为:a)比较浮点数本质上是不一致的,而且实际上是无效的(如果有必要,可以将“number1”的“float”值减去“number2”的“float”值与某个小的“epsilon”进行比较),b)浮点数是邪恶的和不可靠的;如果有必要,应该使用“double”,c)如果这些数字是整数,就不要用这种方式进行比较。@Adam Rosenfield的评论是最好的方法;相信“NSNumber”的比较方法来为您处理。 - Itai Ferber
哦,还有,在这种情况下,“<”不是比较指针,而是比较数字(即“NSNumber”提供的实际值)。不想误导! - Itai Ferber
@Itai 虽然我同意使用 -compare:,但是原贴中的代码实际上是在比较指针(将内存地址转换为整数)。它并没有比较 NSNumber 实例中封装的实际值。 - user557219
@Bavarious 呃,糟糕?你说得对,我错了。但是我评论的其他部分仍然成立,我认为。 - Itai Ferber

43

如果您只是想测试两个NSNumber属性是否具有相同的值,则根据苹果文档,似乎可以使用

- (BOOL)isEqualToNumber:(NSNumber *)aNumber

比较两个NSNumber值的最简单和高效的方法。

例如:

if ([someNumber isEqualToNumber:someOtherNumber])
{
    // The numbers hold the same value
}
else
{
    // The numbers hold different values
}

文档还指出:“如果您知道两个对象是数字,则此方法比compare:更有效。”

每当您需要知道值是较小还是较大时,它们提供了

- (NSComparisonResult)compare:(NSNumber *)aNumber

个人而言,我更喜欢在这一点上提取整数值(或双精度值),并使用常规的<和>运算符进行比较,因为这可以使代码更易于阅读,示例:

if (firstNumber.intValue > secondNumber.intValue)
{
    // First number is greater than the second number
}
else if (firstNumber.intValue == secondNumber.intValue)
{
    // The two numbers have the same value
}
else
{
    // The first number is smaller than the second number
}

在我看来,类似这样的写法比调用 -compare: 要容易理解得多。

Erik


1
你说你想“提取整数值或双精度值”。哪一个?compare: 方法将正确比较64位整数和大型双精度值,这些值无法适应整数。在第一种情况下,提取双精度值会失败。在第二种情况下,提取整数会失败。使用 compare: 是可行的。 - gnasher729

18

NSNumber有一个用于比较的方法: - (NSComparisonResult)compare:(NSNumber*)aNumber

if([numberOne compare:numberTwo] == NSOrderedSame) 
{
      // proceed
}

3
这是最准确可靠的方法,因为你不会冒失失去精度。 - Ky -

1

这些效果很好:

if ([number1 isLessThan:number2])

if ([number1 isLessThanOrEqualTo:number2])

if ([number1 isGreaterThan:number2])

if ([number1 isGreaterThanOrEqualTo:number2])

if ([number1 isEqualTo:number2])

if ([number1 isNotEqualTo:number2])

0

Swift 3.1

let number1 = NSNumber(value: 10.2)
let number2 = NSNumber(value: 20.2)
let result = number1.compare(number2)
if  result == .orderedAscending {

} else if result == .orderedDescending {

} else { // .orderedSame

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接