2010-02-11 13 views
6

क्या किसी ने एक्सेल बनाम सी # में बिल्कुल समान संख्याओं का उपयोग करते समय मुझे बहुत छोटा (10^-08) संख्या अंतर क्यों दिखाई दे सकता है?एक्सेल बनाम सी # संख्या मतभेद

मेरे पास एक सूत्र है और एक ही इनपुट का उपयोग करें। एक्सेल में मुझे एक नंबर मिलता है - सी # में मुझे दूसरा मिलता है। अंतर छोटा है।

मैं सी # में युगल का उपयोग कर रहा हूं और विभाजन कर रहा हूं। मैंने decimals का उपयोग करने की कोशिश की है जो

संपादित करें: यह मुझे एनयूटीएस चला रहा है - मैंने इस पर सभी सुबह बिताया - कोई विचार ??

+0

मुझे लगता है कि पहले एक समान सवाल पूछा गया है ... –

+0

कोई विचार कहां है ?? –

उत्तर

2

अंतर सी # और एक्सेल में विभिन्न मिडपॉइंट राउंडिंग नियमों के कारण है।

Math.Round(someNumber,precision,MidpointRounding.AwayFromZero);

2

प्रयास करें अंतर (10^-08, आप राज्य) के इस तरह के छोटे परिमाण के साथ, मुझे लगता है कि मध्यवर्ती गणना समस्या खड़ी कर रहा जाता है। ध्यान दें कि डबल-परिशुद्धता मान 64 बिट हैं, लेकिन रजिस्ट्रार 80 बिट परिशुद्धता के साथ काम कर सकते हैं। इसलिए, यदि आपके पास कोड अनुक्रम है जहां संकलक रजिस्टरों पर आपकी सभी मध्यवर्ती गणनाओं को रखेगा, तो वास्तव में आपके कोड में अलग-अलग बिंदुओं पर समान गणना की जाती है, तो इंटरमीडिएट परिणामों को 64 में रखने के लिए मजबूर होना बेहतर होगा बिट स्टोरेज स्थानों।

यदि आप अपनी गणना के हिस्से के रूप में एक्सेल कोशिकाओं के भीतर मूल्यों को संग्रहीत करते हैं, तो यह भी आपकी इंटरमीडिएट गणना को 64 बिट्स परिशुद्धता में छोटा कर देगा।

आपको वास्तव में अपना कोड दिखाना होगा: दोनों (ए) एक्सेल गणनाएं दिखाएं (क्या यह वर्कशीट फॉर्मूला है या क्या आप सेल मानों के लिए प्रोग्रामेटिक असाइनमेंट कर रहे हैं?) और (बी) सी # गणना जो आप बना रहे हैं। यदि आप ऐसा करते हैं, तो हमें आपकी मदद करने में सक्षम होना चाहिए। लेकिन अब तक दी गई जानकारी के साथ, हम केवल व्यापक अनुमान लगा सकते हैं।

- माइक

0

यह विषय मेरे साथ ही पहले पागल संचालित है =)।

कुछ साल पहले, मैंने पाया कि एक्सेल की वर्कशीट =ROUND() फ़ंक्शन ने वीबीए के ROUND() फ़ंक्शन से अलग-अलग परिणाम दिए। मैंने यह भी पाया कि वीबीए और माईएसक्यूएल संस्करण 4.x (सटीक संस्करण को याद नहीं किया जा सकता है; 5.x से पहले) फ्लोटिंग-पॉइंट नंबर प्रकारों के लिए सटीक वही एल्गोरिदम का उपयोग किया जाता है। वे "बैंकर के गोलाकार" के एक दोषपूर्ण संस्करण का उपयोग कर रहे थे। अंततः MySQL ने भविष्य के संस्करणों में अपना गोलाकार बदल दिया, लेकिन किसी ने इंगित किया कि वीबीए और माईएसQL 4.x लागू किए गए तरीके के बीच समानता ROUND दोनों की वजह से सी प्रोग्रामिंग भाषा (संभवतः वीबीए बनाने के लिए उपयोग की जाती है) MySQL) दौर लागू किया।

वीबीए और MySQL 4.x दोनों बस कार्यान्वित करने के लिए उपयोग किए जाने वाले सी को लागू किया गया। हालांकि, कई समकालीन प्रोग्रामिंग भाषाओं ने विभिन्न कारणों से अपने स्वयं के गोलाकार तरीकों को रोल करना चुना है; कभी-कभी यह आईईईई स्पेक के अनुसार होना चाहिए और कभी-कभी यह उन चीज़ों से मेल खाता है जो वे सोचते हैं कि उपयोगकर्ता अपेक्षा करेगा। वीबीए और माईएसक्यूएल 4.x के मामले में, उपयोगकर्ता द्वारा बैंकर के गोलाकार का एक दोषपूर्ण संस्करण कभी उम्मीद नहीं किया गया था (इसलिए आपकी निराशा), इसलिए भविष्य की भाषाओं ने गोल करने के नए संस्करणों को लागू किया या विकल्पों को प्रदान किया (जैसे decimal सी # में टाइप) कि उपयोगकर्ता अपेक्षित मूल्यों का उत्पादन करने में सक्षम होगा और पूरी प्रक्रिया पर अधिक नियंत्रण रखेगा।

आप हो सकता है VBA के पूर्णांकन के संदर्भ में इस विषय पर आगे व्याख्या के लिए इस लेख को देखने का प्रयास: http://www.vb-helper.com/howto_round_to_specified_digits.html

0

क्या आप वाकई Excel में संपूर्ण संख्या को देख रहे हैं?

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

अब कस्टम सेल प्रारूप "0.00000000000000000" के साथ उस सेल को प्रारूपित करें और आप 3.14159265358979000 देखेंगे (यदि कॉलम पर्याप्त विस्तृत है)।

ध्यान दें कि एक्सेल वास्तव में परिशुद्धता के 15 से अधिक अंकों के साथ आंतरिक रूप से = पीआई() के मान को संग्रहीत करता है। आप इसे "= (पीआई() - 3.14159265358979)" सेल में दर्ज करके देख सकते हैं - सूत्र में ब्रांड्स को शामिल करना सुनिश्चित करें।

अब, बस मज़े के लिए, "सेल में" = पीआई() - 3.14159265358979 "दर्ज करें और आप देखेंगे कि आपको शून्य मिल जाएगा। कुछ मामलों में, जैसे परिणाम "लगभग शून्य" जोड़ने या घटाकर, एक्सेल वास्तव में परिणाम को 0.0 में परिवर्तित कर देगा (यदि आपको यह नहीं पता कि यह हो रहा है तो यह आपको पागल कर सकता है)।

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