अब यह आसान होना चाहिए, लेकिन योग दो कैसे हो सकता है NSNumber
? की तरह है कि:
[one floatValue] + [two floatValue]
या एक बेहतर तरीका मौजूद है?
जवाबों:
वास्तव में एक बेहतर तरीका नहीं है, लेकिन आपको वास्तव में ऐसा नहीं करना चाहिए अगर आप इसे टाल सकते हैं। NSNumber
स्केलर संख्या के लिए एक आवरण के रूप में मौजूद है ताकि आप उन्हें संग्रह में संग्रहीत कर सकें और उन्हें अन्य के साथ बहुरूपिक रूप से पास कर सकें NSObjects
। वे वास्तव में वास्तविक गणित में संख्याओं को संग्रहीत करने के लिए उपयोग नहीं किए जाते हैं। यदि आप उन पर गणित करते हैं, तो यह केवल स्केलर पर ऑपरेशन करने की तुलना में बहुत धीमा है, जो शायद इसलिए इसके लिए कोई सुविधा विधियां नहीं हैं।
उदाहरण के लिए:
NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];
संदेश प्रेषण पर न्यूनतम 21 निर्देशों पर उड़ रहा है, और हालांकि गणित के 1 निर्देश को करने के लिए विधियों को अनबॉक्स करने के लिए और (शायद कुछ सौ) बॉक्स को रीबॉक्स करने के लिए बहुत सारे कोड हैं।
तो अगर आपको dicts में नंबरों को स्टोर करने की आवश्यकता है a NSNumber
, यदि आपको किसी ऐसी चीज़ को पास करने की ज़रूरत है जो किसी फ़ंक्शन का उपयोग करने वाली संख्या या स्ट्रिंग हो सकती है NSNumber
, लेकिन यदि आप स्केलर सी प्रकार के साथ गणित स्टिक करना चाहते हैं।
NSDecimalNumber ( NSNumber के उपवर्ग ) में वे सभी उपहार हैं जिनकी आप तलाश कर रहे हैं:
– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
...
यदि कंप्यूटिंग प्रदर्शन रुचि का है, तो C ++ सरणी std :: वेक्टर या जैसे कन्वर्ट करें।
अब मैं कभी भी C-Arrays का उपयोग नहीं करता; गलत इंडेक्स या पॉइंटर का उपयोग करके क्रैश करना बहुत आसान है। और हर नए [] को हटाने के लिए [] के साथ बहुत थकाऊ।
NSDecimalNumber
एस जोड़ने के बाद , NSDecimalNumber
परिणाम को वापस कैसे कन्वर्ट करें NSNumber
? (यह सवाल दो NSNumber
एस को जोड़ने के बारे में है, दो एस को जोड़ने के बारे में नहीं है NSDecimalNumber
।)
@interface NSDecimalNumber : NSNumber
आप उपयोग कर सकते हैं
NSNumber *sum = @([first integerValue] + [second integerValue]);
संपादित करें: जैसा कि ओहो ने देखा है , यह उदाहरण NSNumber
पूर्णांक मान रखने वाले दो उदाहरणों को जोड़ने के लिए है। यदि आप NSNumber
फ़्लोटिंग-पॉइंट मानों को जोड़ना चाहते हैं, तो आपको निम्न कार्य करने चाहिए:
NSNumber *sum = @([first floatValue] + [second floatValue]);
int
या long
या यह बड़ा भाई है typedef
'एड NSInteger
में NSNumber
वस्तुओं ।
integerValue
काट-छाँट करता है float
। इस जवाब को कैसे वोट दिया जा सकता है?
integerValue
यदि आप संख्याओं के दशमलव भाग को संरक्षित करना चाहते हैं तो दुनिया में आप क्यों उपयोग करेंगे ?
वर्तमान शीर्ष मतदान का जवाब फ़्लोट्स के उपयोग के कारण मुश्किल से निदान कीड़े और सटीक नुकसान के लिए जा रहा है। यदि आप NSNumber मानों पर संख्या संचालन कर रहे हैं, तो आपको पहले NSDecimalNumber में कनवर्ट करना चाहिए और इसके बजाय उन ऑब्जेक्ट्स के साथ संचालन करना चाहिए।
से प्रलेखन :
NSDecimalNumber, NSNumber का एक अपरिवर्तनीय उपवर्ग, बेस -10 अंकगणित करने के लिए एक वस्तु-उन्मुख आवरण प्रदान करता है। एक उदाहरण किसी भी संख्या का प्रतिनिधित्व कर सकता है जिसे mantissa x 10 ^ घातांक के रूप में व्यक्त किया जा सकता है जहां mantissa 38 अंकों तक लंबा एक दशमलव पूर्णांक है, और घातांक 127 के माध्यम से -128 से पूर्णांक है।
इसलिए, आपको अपने NSNumber उदाहरणों को NSDecimalNumbers के रूप में परिवर्तित करना चाहिए, आप [NSNumber decimalValue]
जो भी अंकगणित करना चाहते हैं, उसे करें, फिर जब आप कर लें तो 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)
उपयोग क्यों नहीं NSxEpression
?
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"
आप एक NSExpression का निर्माण भी कर सकते हैं जिसका पुन: उपयोग विभिन्न तर्कों के साथ किया जा सकता है, जैसे:
NSExpression *expr = [NSExpression expressionWithFormat: @"(X+Y)"];
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", y, @"Y", nil];
NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
उदाहरण के लिए, हम समान पार्स की गई अभिव्यक्ति का मूल्यांकन कर सकते हैं, हर बार एक अलग "Y" मान के साथ:
for (float f=20; f<30; f+=2.0) {
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", @(f), @"Y", nil];
NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
}
स्विफ्ट में आप Bolt_Swift लाइब्रेरी https://github.com/williamFalcon/Bolt_Swift का उपयोग करके यह कार्यक्षमता प्राप्त कर सकते हैं ।
उदाहरण:
var num1 = NSNumber(integer: 20)
var num2 = NSNumber(integer: 25)
print(num1+num2) //prints 45