2009-01-29 13 views

उत्तर

134

वास्तव में एक बेहतर तरीका नहीं है, लेकिन यदि आप इससे बच सकते हैं तो आपको वास्तव में ऐसा नहीं करना चाहिए। NSNumber स्केलर संख्याओं के लिए एक रैपर के रूप में मौजूद है ताकि आप उन्हें संग्रह में संग्रहीत कर सकें और उन्हें अन्य NSObjects के साथ बहुरूप रूप से पास कर सकें। वे वास्तव में वास्तविक गणित में संख्याओं को स्टोर करने के लिए उपयोग नहीं किया जाता है। यदि आप उन पर गणित करते हैं तो यह केवल स्केलर्स पर ऑपरेशन करने से बहुत धीमी है, शायद यही कारण है कि इसके लिए कोई सुविधाजनक तरीका नहीं है।

उदाहरण के लिए

:

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

एक न्यूनतम 21 निर्देश पर बह रही है संदेश डिस्पैच पर, और (शायद कुछ सौ) 1 अनुदेश लायक करने के लिए हालांकि ज्यादा कोड तरीकों Unbox करने के लिए लेने के लिए और मूल्यों rebox गणित का अगर आप कुछ हो सकता है कि एक नंबर या एक समारोह में स्ट्रिंग एक NSNumber का उपयोग उत्तीर्ण करने की आवश्यकता

तो अगर आप dicts में नंबर स्टोर करने के लिए की जरूरत है, एक NSNumber उपयोग करें, लेकिन तुम सिर्फ अदिश सी प्रकार के साथ गणित छड़ी करना चाहते हैं ।

+1

मैं जोड़ना होगा कि आप संख्याओं जिसके लिए आप गणित का एक बहुत कुछ कर करने का इरादा के संग्रह को स्टोर करने की जरूरत है - शायद आप वास्तव में उचित संख्यात्मक प्रकार की सी शैली सरणी चाहते हैं? –

+0

जब भी आप बहुत सारे गणित कर रहे हैं तो आप स्केलर्स का उपयोग करना चाहते हैं, आप ऑब्जेक्ट्स का उपयोग करना चाहते हैं जब आपको पॉलीमोर्फिज्म चाहिए या उन्हें मौजूदा कंटेनर में फिट होना चाहिए। –

+0

NSNumber पर उचित विधि 'numberWithFloat:' है - शायद यह उत्तर देने के समय से बदल गई है। – Nick

45

NSDecimalNumber (NSNumber के उपवर्ग) सभी उपहार आप के लिए देख रहे हैं:

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

...

तो कंप्यूटिंग प्रदर्शन ब्याज की है, तो सी ++ में बदलने सरणी std :: वेक्टर या पसंद।

अब मैं कभी भी सी-एरे का उपयोग नहीं करता; गलत इंडेक्स या पॉइंटर का उपयोग करके क्रैश करना बहुत आसान है। और हटाए गए [] के साथ हर नए [] को जोड़ना बहुत कठिन है।

+0

क्या आप "हर नए [] को मिटाने [] के साथ जोड़ना बहुत मुश्किल है।" – jpswain

+0

चलो इसे इस तरह से रखें। सी में, पॉइंटर का उपयोग करने से बचें। उद्देश्य-सी का पूरा बिंदु सी के शीर्ष पर एक परत डाल रहा है जिसके बारे में आपको चिंता करने की ज़रूरत नहीं है। सी सीधे इस्तेमाल करने वाली भाषा नहीं है। यह ऐसा कुछ है जिसे पहले "प्रबंधित" होना चाहिए। –

+0

दो 'NSDecimalNumber' जोड़ने के बाद, 'NSDecimalNumber' परिणाम को वापस 'NSNumber' में कैसे परिवर्तित करें? (यह प्रश्न दो 'एनएसएनंबर' की संख्या जोड़ने के बारे में है, दो 'एनएसडीसीमल नम्बर' नहीं जोड़ रहा है।) – ohho

10

आप

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

संपादन का उपयोग कर सकते हैं: ohho द्वारा मनाया के रूप में, इस उदाहरण दो NSNumber उदाहरणों कि पूर्णांक मूल्यों पकड़ ऊपर जोड़ने के लिए है। आप दो NSNumber की है कि फ्लोटिंग प्वाइंट मान हो जोड़ने के लिए चाहते हैं, तो आपको निम्न कार्य करना चाहिए:

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

का उप-वर्ग है "@" प्रतीक का कारण क्या है? मुझे यकीन नहीं है कि मैं समझता हूं कि यह इस संदर्भ में क्या करता है। –

+0

आह। मैं अब देखता हूं .... यह एक एनएसएनंबर शाब्दिक है, जैसा कि यहां वर्णित है: http://stackoverflow.com/a/11120371/35723 –

+0

हां, @ मिकमेयर्स यह शाब्दिक है जो 'int' या' long' या इसके जैसे प्राइमेटिव को लपेटता है बड़े भाई 'typedef'' 'एनएसआईएनटेगर '' NSNumber' * ऑब्जेक्ट्स * में। – nemesis

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 गणित करने के लिए एक वस्तु उन्मुख आवरण प्रदान करता है। जहां अपूर्णांश 38 अंक की अवधि वाले एक दशमलव पूर्णांक है, और प्रतिपादक 127.

के माध्यम से -128 से एक पूर्णांक इसलिए है एक उदाहरण किसी भी संख्या कि mantissa x 10^प्रतिपादक के रूप में व्यक्त किया जा सकता है प्रतिनिधित्व कर सकते हैं, तो आप परिवर्तित करना चाहिए [NSNumber decimalValue] के माध्यम से NSDecimalNumbers के लिए आपके NSNumber उदाहरण, जो भी अंकगणित आप चाहते हैं उसे निष्पादित करें, फिर जब आप पूरा कर लें तो NSNumber पर वापस असाइन करें।

ऑब्जेक्टिव-सी में:

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) 
संबंधित मुद्दे