2009-01-29 64 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)