2010-08-27 11 views
7

से शुरू होने से Math.Round काम करता है इस तरह भ्रम पर कई धागे शुरू हो गए हैं। अधिकांश भाग के लिए, लोगों को MidpointRounding पैरामीटर में लोगों से चिपकाकर उत्तर दिया जाता है और अधिकांश लोग MidpointRounding.AwayFromZero की अपेक्षा कर रहे हैं। मेरे पास AwayFromZero द्वारा लागू वास्तविक एल्गोरिदम के बारे में एक और सवाल है।गणित। राउंड पद्धति, सबसे छोटे दशमलव

को देखते हुए निम्नलिखित संख्या (गणना की एक संख्या का परिणाम): 13.398749999999999999999999999M

हमारे उपयोगकर्ताओं को एक ही परिणाम है कि एक्सेल उन्हें 13.39875 देना होगा देखने की उम्मीद कर रहे हैं। चूंकि वे वर्तमान में Math.Round (num, 4, MidpointRounding.AwayFromZero) का उपयोग करके उस संख्या को 4 तक गोल कर रहे हैं, परिणाम उनके द्वारा अपेक्षित से .0001 तक बंद है। संभवतः, इसका कारण यह है कि एल्गोरिदम केवल पांचवें अंक (4) को देखता है, और फिर तदनुसार गोल करता है। यदि आप पिछले 9 में घूमना शुरू कर रहे थे, तो असली गणितीय उत्तर वास्तव में आपको एक्सेल के समान नंबर देगा।

तो सवाल यह है कि ... वर्तमान के बजाए इस व्यवहार को अनुकरण करने का कोई तरीका है?

मैंने एक रिकर्सिव फ़ंक्शन लिखा है कि हम इस दौरान उपयोग कर सकते हैं। बस स्पष्टता के लिए, मैं अपने मूल पोस्ट में स्पष्ट किया जाना चाहिए था: लेकिन इससे पहले कि हम यह उत्पादन में डाल मैं देखना क्या अतः समस्या के बारे में सोचा :-)

private decimal Round(decimal num, int precision) 
    { 
     return Round(num, precision, 28); 
    } 

    private decimal Round(decimal num, int precision, int fullPrecision) 
    { 
     if (precision >= fullPrecision) return Math.Round(num, precision); 

     return Round(Math.Round(num, fullPrecision), precision, --fullPrecision); 
    } 

संपादित करना चाहता था। यहां के लिए पूछे जाने वाले राउंडिंग पद्धति की स्थिति वह है जो मुझे व्यवसाय विश्लेषकों और उपयोगकर्ताओं द्वारा प्रस्तुत की जा रही है जो "राउंडिंग त्रुटि" की रिपोर्ट कर रहे हैं। कई बार बताया जाने के बावजूद कि यह गलत नहीं है, वे जो उम्मीद कर रहे हैं उससे अलग हैं ... यह रिपोर्ट आ रही है। इसलिए मैं इस विषय पर जितनी अधिक जानकारी इकट्ठा करने के लिए डेटा इकट्ठा करने के कार्यकाल पर हूं, उपयोगकर्ता

इस मामले में, यह है कि किसी भी अन्य प्रणाली (15 या कुछ और करने के लिए डिफ़ॉल्ट 10 डेटाबेस में, और उत्कृष्टता लगता है) इन औसत मूल्य (जो हम से मेल खाना चाहिए) एक अलग स्तर परिशुद्धता का उपयोग कर रहे उत्पन्न करने के लिए प्रयोग किया जाता रहा है । यह देखते हुए कि हर किसी के पास परिशुद्धता का एक अलग स्तर है, मैं मध्य में फंस गया हूं, कम परिशुद्धता पर जाने के सवाल के साथ, कुछ अजीब राउंडिंग नियम (ऊपर वर्णित अनुसार), या केवल उपयोगकर्ताओं की अपेक्षा से अलग परिणाम हैं।

+1

मैं इस कथन से असहमत हूं कि "वास्तविक गणितीय उत्तर वास्तव में आपको एक्सेल के समान नंबर देगा।" गणितीय गोलाकार विशेष रूप से परिभाषित किया गया है, और यह * कम से कम महत्वपूर्ण अंकों से शुरू नहीं होता है। 13.3 9 874 999 से 6 महत्वपूर्ण अंक गोल करने के परिणामस्वरूप वास्तव में 13.3 9 77 गणित में परिणाम मिलता है। –

+1

@ स्टीफन, अगर मैं उसे सही तरीके से पढ़ता हूं, तो उसका मतलब है कि वह असली गणित करना चाहता है जिसके परिणामस्वरूप त्रुटिपूर्ण दृष्टिकोण के परिणामस्वरूप बग-संगत हो। –

+0

@ जोन: सहमत हुए। मैं बस इंप्रेशन को सही करना चाहता था कि डबल-राउंडिंग गणितीय रूप से सही है और इसलिए अपेक्षित व्यवहार है। –

उत्तर

3

यदि मैं आपको सही मानता हूं, तो लोग 13.3 9 88 की उम्मीद कर रहे हैं क्योंकि वे पहले 13.3 9 875 और फिर 13.3 9 88 तक गोल कर रहे हैं और उन्हें आपको इसके साथ बग-संगत होने की आवश्यकता है।

यदि हां, तो राउंडिंग के एक से अधिक चरणों को दोहराने की कोई आवश्यकता नहीं है, क्योंकि उनकी विधि में दोष केवल गोल करने के अंतिम चरण में आता है (इसकी प्रकृति से, गोल करने से पहले चरण दो चरणों के महत्व को हटा दिया जाता है यह)।

private static decimal InaccurateRound(decimal num, int precision) 
{ 
    return Math.Round(
    Math.Round(num, precision + 1, MidpointRounding.AwayFromZero), 
    precision, MidpointRounding.AwayFromZero); 
} 
+0

डबल राउंडिंग अंतिम स्टॉप नहीं है। किसी भी दोहराव के लिए संबंधित उदाहरण हैं। उदाहरण के लिए, 0.4444444449 केवल तभी तक होगा जब आप दाएं से बाएं प्रत्येक स्थिति में AwayFromZero 10 बार गोलाकार लागू करते हैं। – jmster

3

तो यदि आप उस नंबर को 5 स्थानों पर ले जाते हैं, और फिर परिणाम 4 स्थानों पर गोल करते हैं ... तो आप मूल संख्या को 4 स्थानों पर ले जाने के बजाय एक अलग परिणाम प्राप्त करते हैं? यह उम्मीद है। और मुझे लगता है कि यह बताता है कि आपको क्या करना है। एक और विकल्प यह है कि एक्सेल को पूर्ण परिशुद्धता दिखाएं ताकि "कोड" आपके कोड के समान ही हो। दो बार गोल करना गलत लगता है।

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