2011-09-07 10 views
6

मेरे पास वीबीए में यह अस्पष्ट गोल समस्या है।वीबीए राउंडिंग समस्या

a = 61048.4599674847 
b = 154553063.208822 
c = a + b 
debug.print c 
Result: 
154614111.66879 

यहां सवाल है, वीबीए ने परिवर्तनीय सी को क्यों गोल किया? मैंने किसी भी गोलिंग समारोह को जारी नहीं किया था। जिस मूल्य की मैं अपेक्षा कर रहा था वह 154614111.6687894847 था। भले ही मैं वैरिएबल सी को 15 दशमलव स्थानों पर गोल या प्रारूपित करता हूं, फिर भी मुझे अपना अपेक्षित परिणाम नहीं मिलता है।

कोई भी स्पष्टीकरण की सराहना की जाएगी।

संपादित करें:

सीडीईसी का उपयोग करके अपेक्षित परिणाम प्राप्त हुए। मैं Why does CLng produce different results?

में जोनाथन एलन उत्तर में यह पढ़ा है यहां परीक्षण का परिणाम है:

a = cDec(61048.4599674847) 
b = cDec(154553063.208822) 
c = a + b 
?c 
154614111.6687894847 
+1

(http://support.microsoft [फ्लोटिंग सूत्री अंकगणित Excel में गलत परिणाम दे सकते हैं] .com/केबी/78113) – SeanC

उत्तर

11

कारण सीमित precission है कि एक चल बिन्दु चर में संग्रहित किया जा सकता है।
एक पूर्ण स्पष्टीकरण के लिए आपने पेपर को पढ़ा है कि कंप्यूटिंग सर्वेक्षणों के मार्च 1 99 1 के अंक में प्रकाशित डेविड गोल्डबर्ग द्वारा फ़्लोटिंग-प्वाइंट अंकगणित के बारे में प्रत्येक कंप्यूटर वैज्ञानिक को क्या पता होना चाहिए।

Link to paper

VBA में डिफ़ॉल्ट चल बिन्दु प्रकार Double जो एक आईईईई 64-बिट (8-बाइट) फ्लोटिंग प्वाइंट संख्या है।

वहाँ एक और प्रकार उपलब्ध है: Decimal जो एक 96-बिट (12-बाइट) है 10
बस रखो के एक चर शक्ति से बढ़ाया पूर्णांकों पर हस्ताक्षर किए, इस अस्थायी 28 अंकों precission के बिन्दु संख्या प्रदान करता है।

अपने उदाहरण में उपयोग करने के लिए:

a = CDec(61048.4599674847) 
b = CDec(154553063.208822) 
c = a + b 
debug.print c 
Result: 
154614111.6687894847 
+0

लिंक के लिए धन्यवाद। – Grekoz

3

इसकी अस्पष्ट नहीं है, लेकिन इसके जरूरी स्पष्ट नहीं।

मुझे लगता है कि आपने इसका उत्तर दिया है - लेकिन मूल समस्या मानों के "आकार" में से एक है कि किसी दिए गए प्रकार के चर में कितना डेटा संग्रहीत किया जा सकता है।

यदि (और यह बहुत कच्चा है) तो आप अपने पहले उदाहरण में प्रत्येक संख्या में अंकों की संख्या गिनते हैं, आप देखेंगे कि आपके पास 15 है, जबकि एक फ्लोट (डिफ़ॉल्ट प्रकार) का प्रतिनिधित्व करने वाले मानों की श्रेणी यह बहुत बड़ा है 15 अंकों तक सीमित है (मुझे यकीन है कि कोई इसे सही करने के साथ होगा, मैं विकी बॉक्स पर टिक टिकूंगा ...)

तो जब आप दो संख्याओं को एक साथ जोड़ते हैं तो यह कम से कम महत्वपूर्ण खो देता है प्रवाह के लिए स्वीकार्य परिशुद्धता के भीतर रहने के लिए मूल्य।

एक CDEC आप चर (दशमलव) की एक अलग प्रकार में रूपांतरित करते हैं कि अधिक से अधिक परिशुद्धता के लिए सक्षम है ऐसा करने से