如何添加两个NSNumber对象?

时间:2009-01-29 23:54:46

标签: objective-c math nsnumber

现在这一定很容易,但如何将两个NSNumber相加?就像:

[one floatValue] + [two floatValue]

还是存在更好的方式?

6 个答案:

答案 0 :(得分:140)

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

例如:

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

至少有21个关于消息发送的指令,无论这些方法需要多少代码来取消装箱并重新装箱值(可能是几百个)来做1个指令的数学运算。

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

答案 1 :(得分:48)

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

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

...

如果感兴趣的是计算性能,则转换为C ++数组std :: vector或类似。

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

答案 2 :(得分:11)

您可以使用

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

编辑: 正如 ohho 所观察到的,此示例用于添加两个保存整数值的NSNumber实例。如果要添加两个包含浮点值的NSNumber,则应执行以下操作:

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

答案 3 :(得分: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)

答案 4 :(得分:0)

为什么不使用attributetype ( 1.3.6.1.4.1.18060.0.4.3.2.1 NAME 'test-user' DESC 'test' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) objectclass ( 1.3.6.1.4.1.18060.0.4.3.3.1 NAME 'ship' DESC 'test' SUP top STRUCTURAL MUST cn MAY ( test-user $ description ) )

NSxEpression

您还可以构建一个NSExpression,该NSExpression可以重复使用以使用不同的参数求值,例如:

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"

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

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

答案 5 :(得分:-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