现在这一定很容易,但如何总结两个NSNumber
?就好像:
[one floatValue] + [two floatValue]
还是存在更好的方式?
没有更好的方法,但如果你能避免它,你真的不应该这样做。 NSNumber
作为标量数字的包装存在,因此您可以将它们存储在集合中,并与其他NSObjects
以多态方式传递它们。它们并不真正用于在实际数学中存储数字。如果你对它们进行数学运算,它比仅对标量执行操作要慢得多,这可能就是为什么没有方便的方法。
例如:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
在消息调度上至少有21个指令,无论这些方法需要多少代码来取消装箱和重新装箱值(可能是几百个)来完成1个指令的数学运算。
因此,如果您需要在dicts中存储数字,请使用NSNumber
,如果您需要将可能是数字或字符串的内容传递给函数,请使用NSNumber
,但如果您只是想使用标量C类型进行数学操作。
NSDecimalNumber(NSNumber的子类)拥有您正在寻找的所有好东西:
– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
...
如果感兴趣的是计算性能,那么转换为C ++数组std :: vector等。
现在我再也不用C-Arrays了;使用错误的索引或指针很容易崩溃。将每个new []与delete []配对非常繁琐。
您可以使用
NSNumber *sum = @([first integerValue] + [second integerValue]);
编辑:正如ohho所观察到的,这个例子是为了加起两个保存整数值的NSNumber
实例。如果要添加两个保存浮点值的NSNumber
,则应执行以下操作:
NSNumber *sum = @([first floatValue] + [second floatValue]);
目前的top-voted answer将导致难以诊断的错误和由于使用浮动而导致的精度损失。如果您正在对NSNumber值执行数字操作,则应首先转换为NSDecimalNumber,然后使用这些对象执行操作。
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)
为什么不使用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]);
}
在Swift中,您可以使用Bolt_Swift库https://github.com/williamFalcon/Bolt_Swift来获得此功能。
例:
var num1 = NSNumber(integer: 20)
var num2 = NSNumber(integer: 25)
print(num1+num2) //prints 45