2009-01-29 62 views

回答

134

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

例如:

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

是最小的21个指令吹消息调度,并且也不管代码的方法采取拆箱和REBOX值(可能是几百)做1个指令价值的数学。

所以,如果你需要存储的类型的字典号码使用NSNumber,如果你需要传递的东西,可能是一个数字或字符串成一个函数使用NSNumber,但如果你只想做数学棒与标C型。

+1

我想补充一点,如果你需要存储,你打算做了很多数学数的集合 - 也许你真的想要一个适当的数字类型的C风格的数组? – 2009-01-30 06:53:41

+0

无论何时你需要使用标量来进行大量的数学运算,当你需要多态性或需要适应现有的容器时,您都希望使用这些对象。 – 2009-01-30 07:36:02

+0

NSNumber上的正确方法是'numberWithFloat:' - 也许这从回答时起就已经改变了。 – Nick 2010-11-30 03:29:21

45

NSDecimalNumber(的NSNumber子类)拥有所有你正在寻找的东西:

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

...

如果计算性能很感兴趣,然后转换为C++数组的std ::向量或喜欢。

现在我从不再使用C阵列了;使用错误的索引或指针很容易崩溃。并且非常繁琐地将每个新的[]与delete []配对。

10

您可以使用

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

编辑: 如ohho观察到,这个例子是用于相加持有整数值的两个NSNumber实例。如果你想加起来持有浮点值的两个NSNumber的,你应该做到以下几点:

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

在斯威夫特您可以通过使用Bolt_Swift库https://github.com/williamFalcon/Bolt_Swift得到这个功能。

例子:

var num1 = NSNumber(integer: 20) 
    var num2 = NSNumber(integer: 25) 
    print(num1+num2) //prints 45 
2

目前top-voted answer将会导致难以诊断的错误和精度损失由于使用花车。如果您正在对NSNumber值进行数字操作,则应先转换为NSDecimalNumber,然后对这些对象执行操作。

documentation

NSDecimalNumber,NSNumber的的不可变的子类,提供了这样做的基10算术的面向对象的包装。一个实例可以表示可被表示为尾数×10 ^指数任何数,其中尾数是十进制整数高达38位长,和指数是从-128至127

的整数。因此,应转换你的NSNumber实例通过[NSNumber decimalValue]的方式分配给NSDecimalNumbers,完成你想要的任何算术运算,然后当你完成后重新分配给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)