2015-09-25 10 views
8

मैंने स्टैक ओवरफ्लो और सी # दस्तावेज में विभिन्न पोस्ट में पढ़ा है, जो long (या किसी अन्य डेटा प्रकार का प्रतिनिधित्व करने वाले नंबर) को double में परिवर्तित कर देता है। फ्लोटिंग पॉइंट नंबरों के प्रतिनिधित्व के कारण यह काफी स्पष्ट है।सटीक हानि कितनी बड़ी है जो लंबे समय तक परिवर्तित हो रही है?

मेरा सवाल यह है कि अगर मैं बड़ी संख्या को double में परिवर्तित करता हूं तो सटीकता का नुकसान कितना बड़ा होता है? क्या मुझे +/- एक्स से भिन्न मतभेदों की अपेक्षा करनी है?

कारण मैं यह जानना चाहता हूं कि मुझे एक सतत काउंटर से निपटना है जो long है। यह मान मेरे आवेदन द्वारा string के रूप में पढ़ा जाता है, इसे कास्ट करने की आवश्यकता है और इसे विभाजित करना है। 10 या कुछ अन्य छोटी संख्या और फिर आगे संसाधित किया जाता है।

decimal इस कार्य के लिए अधिक उपयुक्त होगा?

+0

अच्छी तरह से 'दशमलव' निश्चित रूप से 'लंबी' में सभी जानकारी को बनाए रख सकता है ... लेकिन यह वास्तव में आपकी आवश्यकताओं को स्पष्ट नहीं करता है कर रहे हैं। –

+0

@ जोन्स स्केट वास्तव में कोई नहीं, मुझे पता है कि इसे दशमलव के साथ कैसे हल किया जाए, लेकिन प्रश्न जिज्ञासा से कम या कम है। मुझे उम्मीद करने के लिए कितना सटीक नुकसान होगा। – John

उत्तर

8

परिवर्तित long (या किसी अन्य डेटा एक नंबर का प्रतिनिधित्व प्रकार) double को परिशुद्धता खो देता है। फ्लोटिंग पॉइंट नंबरों के प्रतिनिधित्व के कारण यह काफी स्पष्ट है।

यह ऐसा लगता है उससे कम स्पष्ट है, क्योंकि सटीक हानि long के मान पर निर्भर करती है। -2 और 2 के बीच मूल्यों के लिए कोई सटीक हानि नहीं है।

यदि मैं बड़ी संख्या में दो बार परिवर्तित करता हूं तो सटीकता का नुकसान कितना बड़ा होता है? यदि आप कुछ सटीक नुकसान का अनुभव आप 52-बिट सीमा से ऊपर कितना जाना पर निर्भर करता है कि मैं मतभेद 2 ऊपर परिमाण के साथ +/- एक्स

से बड़ी संख्या के लिए उम्मीद करना है।यदि आपके long का पूर्ण मान 58 बिट्स में फिट बैठता है, तो आपके सटीक हानि की परिमाण 58-52 = 6 बिट्स या +/- 64 होगी।

decimal इस कार्य के लिए अधिक उपयुक्त होगा?

decimaldouble से भिन्न प्रतिनिधित्व है, और यह एक अलग आधार का उपयोग करता है। चूंकि आप अपनी संख्या को "छोटी संख्या" से विभाजित करने की योजना बना रहे हैं, इसलिए अलग-अलग प्रतिनिधित्व आपको विभाजन पर अलग-अलग त्रुटियां देंगे। विशेष रूप से, double दो (2, 4, 8, 16, इत्यादि) की शक्तियों द्वारा विभाजन को संभालने में बेहतर होगा क्योंकि इस तरह के विभाजन को मंथिसा को छूए बिना घातीय से घटाकर पूरा किया जा सकता है। इसी तरह, बड़े decimal एस को दस, सौ, आदि द्वारा विभाजित होने पर महत्वपूर्ण अंकों का कोई नुकसान नहीं होगा।

+0

बिल्कुल सही! मैंने सोचा कि यह गणना मुझे सटीक नुकसान देगी लेकिन यकीन नहीं था। नुकसान की अपेक्षा वास्तव में छोटी है। धन्यवाद! – John

3

long

long एक 64-बिट पूर्णांक प्रकार है और 9.223.372.036.854.775.807 को -9.223.372.036.854.775.808 से मान हो सकते हैं (अधिकतम। 19 अंक)।

double

double 15 16 अंकों की सटीक है कि 64-बिट फ्लोटिंग प्वाइंट प्रकार है। इसलिए यदि आपकी संख्या ~ 100,000,000,000,000 से अधिक है तो डेटा निश्चित रूप से खो सकता है।

decimal

decimal एक 128-बिट दशमलव प्रकार है और 28-29 अंक के बैठने की। इसलिए long से decimal पर कास्ट करना हमेशा सुरक्षित रहता है।

सिफ़ारिश

मैं सलाह है कि आप जो नंबर आप के साथ काम करेंगे के बारे में सही-सही उम्मीदों का पता लगाना। फिर आप उपयुक्त डेटा प्रकार चुनने में एक सूचित निर्णय ले सकते हैं। चूंकि आप अपनी संख्या को स्ट्रिंग से पढ़ रहे हैं, क्या यह संभव नहीं है कि वे 28 अंकों से भी अधिक हों? उस स्थिति में, सूचीबद्ध प्रकारों में से कोई भी आपके लिए काम नहीं करेगा, और इसके बजाय आपको किसी प्रकार का BigInt कार्यान्वयन करना होगा।

+0

यह निश्चित है कि यह लंबी अवधि की सीमा से अधिक नहीं होगा। जवाब के लिए धन्यवाद! – John

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