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
मैं क्या गलत कर रहा हूं? मुझे नहीं पता कि इस व्यवहार को कैसे समझाया जाए।
मुझे इसे शुरुआत से नहीं मिला और मेरा अपना उत्तर पोस्ट किया, लेकिन अब मुझे यह मिल गया है, और आपका जवाब मेरे बराबर है। दूसरों के लिए, जो मेरे जैसे ही, पूरी तरह से समझ में नहीं आया - 'NSDecimalNumber' के अंदर दशमलव को लंबे समय तक हस्ताक्षर किए जाने से पहले डबल करने के लिए डाला जाता है। वैसे भी, मुझे लगता है कि यह मौलिक एसडीके बग है। –
@AlexanderN। मैं असहमत हूं कि यह एक मौलिक एसडीके की कमी है: यदि आप 'एनएसडीसीमल नम्बर' के भीतर रहते हैं, तो आपको ठोस परिशुद्धता मिलती है, जो कि एसडीके के डिजाइनरों के लिए महत्वपूर्ण है। केवल अन्य सुविधा के लिए रूपांतरण केवल सुविधा के लिए हैं; उनका उपयोग समझने के साथ आता है कि प्रतिनिधित्व में मतभेदों के कारण कुछ परिशुद्धता खो सकती है। – dasblinkenlight
मैं इसे कम करता हूं। लेकिन क्या आपको नहीं लगता कि यह थोड़ा अजीब है - कास्ट पूर्णांक (इस मामले में) दशमलव लंबे समय तक पूर्णांक तक और सटीकता खो देता है, जैसे फ्लोट-इंट कास्टिंग में? –