现在这应该很简单,但是如何对两个NSNumber
进行求和?类似于:
[one floatValue] + [two floatValue]
还有更好的方法吗?
现在这应该很简单,但是如何对两个NSNumber
进行求和?类似于:
[one floatValue] + [two floatValue]
还有更好的方法吗?
没有更好的方法,但如果可以避免,您确实不应该这样做。 NSNumber
作为一个封装器存在于标量数字中,因此您可以将它们存储在集合中并与其他NSObjects
多态地传递它们。它们实际上并不用于存储数学上的数字。如果您在它们上执行数学运算,那么速度会比仅对标量执行操作要慢得多,这可能是为什么没有方便的方法的原因。
例如:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
调用消息分派至少需要21条指令,再加上方法解包和重新封装值所需的代码量(大约几百行),才能执行一次有关数学的指令。
因此,如果您需要在字典中存储数字,请使用 NSNumber
;如果您需要将可能是数字或字符串的参数传递给函数,请使用 NSNumber
;但如果您只是想进行数学计算,请使用标量 C 类型。
NSDecimalNumber(NSNumber的子类)拥有你所需要的所有好处:
– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
如果需要考虑计算性能,那么请转换为C++的数组std::vector或类似类型。
现在我不再使用C-Arrays了;使用错误的索引或指针很容易导致崩溃,并且每次都需要配对使用new []和delete[]非常繁琐。
@interface NSDecimalNumber : NSNumber
- Steven Fisher你可以使用
NSNumber *sum = @([first integerValue] + [second integerValue]);
编辑:
正如ohho所观察到的,此示例是将保存整数值的两个NSNumber
实例相加。如果您想要相加保存浮点值的两个NSNumber
,您应该执行以下操作:
NSNumber *sum = @([first floatValue] + [second floatValue]);
int
或long
或其大兄弟typedef
的NSInteger
包装成NSNumber
*对象的字面量。 - nemesisintegerValue
截断了float
。如何为此回答点赞? - ohhointegerValue
? - nemesis来自文档:
因此,您应该通过NSDecimalNumber是NSNumber的不可变子类,提供了一个面向对象的基于10进制算术的封装。一个实例可以表示任何可以表示为mantissa x 10^exponent的数字,其中mantissa是一个长达38位的十进制整数,指数是从-128到127的整数。
[NSNumber decimalValue]
将NSNumber实例转换为NSDecimalNumbers,执行所需的算术运算,然后在完成后重新分配给NSNumber。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]);
for (float f=20; f<30; f+=2.0) {
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", @(f), @"Y", nil];
NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
}
var num1 = NSNumber(integer: 20)
var num2 = NSNumber(integer: 25)
print(num1+num2) //prints 45