84

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

[one floatValue] + [two floatValue]

还是存在更好的方法?

4

6 回答 6

148

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

例如:

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

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

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

于 2009-01-30T00:02:09.377 回答
50

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

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

...

如果对计算性能感兴趣,则转换为 C++ 数组 std::vector 等。

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

于 2011-06-23T19:48:59.490 回答
12

您可以使用

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

编辑:正如ohho所观察到的,此示例用于将两个NSNumber保存整数值的实例相加。如果您想将两个NSNumber保存浮点值的 ' 相加,您应该执行以下操作:

NSNumber *sum = @([first floatValue] + [second floatValue]);
于 2013-11-14T14:15:03.033 回答
9

当前投票最多的答案将导致难以诊断的错误和由于使用浮点数而导致的精度损失。如果您对 NSNumber 值进行数字操作,则应先转换为 NSDecimalNumber 并改为对这些对象执行操作。

文档中:

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

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

在 Objective-C 中:

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

在斯威夫特 3 中:

let a = NSDecimalNumber(decimal: one.decimalValue)
let b = NSDecimalNumber(decimal: two.decimalValue)
let result: NSNumber = a.adding(b)
于 2017-01-17T16:22:47.187 回答
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]);
 }
于 2019-02-20T08:06:13.507 回答
-2

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

例子:

  var num1 = NSNumber(integer: 20)
  var num2 = NSNumber(integer: 25)
  print(num1+num2) //prints 45
于 2015-05-17T13:09:31.583 回答