如何添加两个NSNumber对象?
现在这个一定很容易,但是如何总结两个NSNumber
呢? 就好像:
[one floatValue] + [two floatValue]
还是存在一个更好的办法?
没有更好的办法,但是如果你能避免,你真的不应该这样做。 NSNumber
作为标量数字的包装存在,所以你可以将它们存储在集合中,并将它们与其他NSObjects
多态传递。 他们不是真的用来存储实际的math数字。 如果你对它们进行math运算,那么它比在标量上执行操作要慢得多,这可能就是为什么没有方便的方法。
例如:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
至less有21条消息发送指令,无论用什么代码来解开和重新input数值(可能是几百)来执行一条指令的math运算。
所以,如果你需要存储数字在字典中使用一个NSNumber
,如果你需要传递一些可能是一个数字或string到一个函数使用NSNumber
,但如果你只是想用标量Ctypes做math棒。
NSDecimalNumber ( NSNumber的子类)有你正在寻找的所有好东西:
– decimalNumberByAdding: – decimalNumberBySubtracting: – decimalNumberByMultiplyingBy: – decimalNumberByDividingBy: – decimalNumberByRaisingToPower:
…
如果计算性能是有趣的,那么转换为C ++数组std :: vector或类似的。
现在我再也不用C系列了。 使用错误的索引或指针很容易崩溃。 而且非常繁琐的将每个新的[]与delete []配对。
您可以使用
NSNumber *sum = @([first integerValue] + [second integerValue]);
编辑:由ohho观察,这个例子是加起来两个NSNumber
实例保存整数值。 如果你想添加两个保存浮点值的NSNumber
,你应该这样做:
NSNumber *sum = @([first floatValue] + [second floatValue]);
目前最高票数的答案将导致难以诊断的错误和由于使用浮游物而导致的精确度损失。 如果您在NSNumber值上进行数字操作,则应先转换为NSDecimalNumber,然后对这些对象执行操作。
从文档 :
NSDecimalNumber是NSNumber的一个不可变的子类,它提供了一个面向对象的封装来完成基10algorithm。 一个实例可以表示任何可以表示为尾数×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)
在Swift中,你可以通过使用Bolt_Swift库https://github.com/williamFalcon/Bolt_Swift来获得这个function。;
例:
var num1 = NSNumber(integer: 20) var num2 = NSNumber(integer: 25) print(num1+num2) //prints 45