2012-01-05 13 views
6
NSLog(@"%llu\n\n", ULONG_LONG_MAX); 

NSDecimalNumber *decimal = [NSDecimalNumber decimalNumberWithString:@"154550038129946620"]; 
NSLog(@"%@", decimal); 
NSLog(@"%llu\n\n", [decimal unsignedLongLongValue]); 

decimal = [NSDecimalNumber decimalNumberWithString:@"154550038129946628"]; 
NSLog(@"%@", decimal); 
NSLog(@"%llu", [decimal unsignedLongLongValue]); 

दोनों मान ULONG_LONG_MAX से कम हैं। लेकिन, हम आउटपुट में जो देखते हैं वह है:उद्देश्य सी अजीब दशमलव से लंबे लंबे रूपांतरण

2012-01-05 17:41:55.879 test[1276:207] 18446744073709551615 

2012-01-05 17:41:55.969 test[1276:207] 154550038129946620 
2012-01-05 17:41:56.095 test[1276:207] 154550038129946624 

2012-01-05 17:41:56.096 test[1276:207] 154550038129946628 
2012-01-05 17:41:56.096 test[1276:207] 154550038129946624 

मैं क्या गलत कर रहा हूं? मुझे नहीं पता कि इस व्यवहार को कैसे समझाया जाए।

उत्तर

5

NSDecimalNumberunsignedLongLongValue विधि की कमी है, इसलिए इसे NSNumber से डिफ़ॉल्ट कार्यान्वयन प्राप्त होता है। NSDecimalNumber के मूल्य प्राप्त करने का एकमात्र तरीका NSDecimal संरचना, या double प्राप्त कर रहा है। रूपांतरण त्रुटि NSDecimalNumber को double में परिवर्तित करने की प्रक्रिया में पेश की गई है।

+0

मुझे इसे शुरुआत से नहीं मिला और मेरा अपना उत्तर पोस्ट किया, लेकिन अब मुझे यह मिल गया है, और आपका जवाब मेरे बराबर है। दूसरों के लिए, जो मेरे जैसे ही, पूरी तरह से समझ में नहीं आया - 'NSDecimalNumber' के अंदर दशमलव को लंबे समय तक हस्ताक्षर किए जाने से पहले डबल करने के लिए डाला जाता है। वैसे भी, मुझे लगता है कि यह मौलिक एसडीके बग है। –

+0

@AlexanderN। मैं असहमत हूं कि यह एक मौलिक एसडीके की कमी है: यदि आप 'एनएसडीसीमल नम्बर' के भीतर रहते हैं, तो आपको ठोस परिशुद्धता मिलती है, जो कि एसडीके के डिजाइनरों के लिए महत्वपूर्ण है। केवल अन्य सुविधा के लिए रूपांतरण केवल सुविधा के लिए हैं; उनका उपयोग समझने के साथ आता है कि प्रतिनिधित्व में मतभेदों के कारण कुछ परिशुद्धता खो सकती है। – dasblinkenlight

+0

मैं इसे कम करता हूं। लेकिन क्या आपको नहीं लगता कि यह थोड़ा अजीब है - कास्ट पूर्णांक (इस मामले में) दशमलव लंबे समय तक पूर्णांक तक और सटीकता खो देता है, जैसे फ्लोट-इंट कास्टिंग में? –

संबंधित मुद्दे