现在这一定很容易,但如何将两个NSNumber
相加?就像:
[one floatValue] + [two floatValue]
还是存在更好的方式?
答案 0 :(得分:140)
没有更好的方法,但如果你能避免它,你真的不应该这样做。 NSNumber
作为标量数字的包装存在,因此您可以将它们存储在集合中,并以其他NSObjects
多态方式传递它们。它们并不真正用于在实际数学中存储数字。如果你对它们进行数学运算,它比仅对标量执行操作要慢得多,这可能就是为什么它没有方便的原因。
例如:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
至少有21个关于消息发送的指令,无论这些方法需要多少代码来取消装箱并重新装箱值(可能是几百个)来做1个指令的数学运算。
因此,如果您需要在dicts中存储数字,请使用NSNumber
,如果您需要将可能是数字或字符串的内容传递给函数,请使用NSNumber
,但如果您只是想数学坚持使用标量C类型。
答案 1 :(得分:48)
NSDecimalNumber(NSNumber的子类)拥有您正在寻找的所有好东西:
– 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,然后使用这些对象执行操作。
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