से शुरू होने से 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 डेटाबेस में, और उत्कृष्टता लगता है) इन औसत मूल्य (जो हम से मेल खाना चाहिए) एक अलग स्तर परिशुद्धता का उपयोग कर रहे उत्पन्न करने के लिए प्रयोग किया जाता रहा है । यह देखते हुए कि हर किसी के पास परिशुद्धता का एक अलग स्तर है, मैं मध्य में फंस गया हूं, कम परिशुद्धता पर जाने के सवाल के साथ, कुछ अजीब राउंडिंग नियम (ऊपर वर्णित अनुसार), या केवल उपयोगकर्ताओं की अपेक्षा से अलग परिणाम हैं।
मैं इस कथन से असहमत हूं कि "वास्तविक गणितीय उत्तर वास्तव में आपको एक्सेल के समान नंबर देगा।" गणितीय गोलाकार विशेष रूप से परिभाषित किया गया है, और यह * कम से कम महत्वपूर्ण अंकों से शुरू नहीं होता है। 13.3 9 874 999 से 6 महत्वपूर्ण अंक गोल करने के परिणामस्वरूप वास्तव में 13.3 9 77 गणित में परिणाम मिलता है। –
@ स्टीफन, अगर मैं उसे सही तरीके से पढ़ता हूं, तो उसका मतलब है कि वह असली गणित करना चाहता है जिसके परिणामस्वरूप त्रुटिपूर्ण दृष्टिकोण के परिणामस्वरूप बग-संगत हो। –
@ जोन: सहमत हुए। मैं बस इंप्रेशन को सही करना चाहता था कि डबल-राउंडिंग गणितीय रूप से सही है और इसलिए अपेक्षित व्यवहार है। –