如何添加两个NSNumber对象?

问题描述 投票:75回答:6

现在这一定很容易,但如何总结两个NSNumber?就好像:

[one floatValue] + [two floatValue]

还是存在更好的方式?

objective-c math nsnumber
6个回答
142
投票

没有更好的方法,但如果你能避免它,你真的不应该这样做。 NSNumber作为标量数字的包装存在,因此您可以将它们存储在集合中,并与其他NSObjects以多态方式传递它们。它们并不真正用于在实际数学中存储数字。如果你对它们进行数学运算,它比仅对标量执行操作要慢得多,这可能就是为什么没有方便的方法。

例如:

NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];

在消息调度上至少有21个指令,无论这些方法需要多少代码来取消装箱和重新装箱值(可能是几百个)来完成1个指令的数学运算。

因此,如果您需要在dicts中存储数字,请使用NSNumber,如果您需要将可能是数字或字符串的内容传递给函数,请使用NSNumber,但如果您只是想使用标量C类型进行数学操作。


48
投票

NSDecimalNumberNSNumber的子类)拥有您正在寻找的所有好东西:

– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:

...

如果感兴趣的是计算性能,那么转换为C ++数组std :: vector等。

现在我再也不用C-Arrays了;使用错误的索引或指针很容易崩溃。将每个new []与delete []配对非常繁琐。


12
投票

您可以使用

NSNumber *sum = @([first integerValue] + [second integerValue]);

编辑:正如ohho所观察到的,这个例子是为了加起两个保存整数值的NSNumber实例。如果要添加两个保存浮点值的NSNumber,则应执行以下操作:

NSNumber *sum = @([first floatValue] + [second floatValue]);

4
投票

目前的top-voted answer将导致难以诊断的错误和由于使用浮动而导致的精度损失。如果您正在对NSNumber值执行数字操作,则应首先转换为NSDecimalNumber,然后使用这些对象执行操作。

来自documentation

NSDecimalNumber是NSNumber的不可变子类,它提供了一个面向对象的包装器,用于执行base-10算术。实例可以表示可以表示为尾数x 10 ^指数的任何数字,其中尾数是长度为38位的十进制整数,指数是-128到127的整数。

因此,您应该通过[NSNumber decimalValue]将NSNumber实例转换为NSDecimalNumbers,执行您想要的任何算术,然后在完成后分配回NSNumber。

在Objective-C中:

NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithDecimal:one.decimalValue]
NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithDecimal:two.decimalValue]
NSNumber *result = [a decimalNumberByAdding:b]

在Swift 3中:

let a = NSDecimalNumber(decimal: one.decimalValue)
let b = NSDecimalNumber(decimal: two.decimalValue)
let result: NSNumber = a.adding(b)

0
投票

为什么不使用NSxEpression

NSNumber *x = @(4.5), *y = @(-2);

NSExpression *ex = [NSExpression expressionWithFormat:@"(%@ + %@)", x, y];
NSNumber *result = [ex expressionValueWithObject:nil context:nil];

NSLog(@"%@",result); // will print out "2.5"

您还可以构建一个可以重用以使用不同参数进行求值的NSExpression,如下所示:

NSExpression *expr = [NSExpression expressionWithFormat: @"(X+Y)"];
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", y, @"Y", nil];
NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);

例如,我们可以循环评估相同的解析表达式,每次使用不同的“Y”值:

 for (float f=20; f<30; f+=2.0) {
    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", @(f), @"Y", nil];
    NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
 }

-1
投票

在Swift中,您可以使用Bolt_Swift库https://github.com/williamFalcon/Bolt_Swift来获得此功能。

例:

  var num1 = NSNumber(integer: 20)
  var num2 = NSNumber(integer: 25)
  print(num1+num2) //prints 45
© www.soinside.com 2019 - 2024. All rights reserved.