2010-10-19 20 views
12

मेरे पास नेट के अंदर एक गोल समस्या है।नेट राउंडिंग अंक

मैं एक 3 अंक संख्या को दो अंकों तक गोल कर रहा हूं और यह एक संख्या के साथ कुछ समस्याएं पैदा कर रहा है।

यदि मैं 34.425 से दो दशमलव स्थानों पर घूमने की कोशिश करता हूं तो इसे 34.43 तक ले जाना चाहिए। मैं roundawayfromzero विकल्प का उपयोग कर रहा हूं और इस कार्यक्रम को छोड़कर इस कार्यक्रम में हर नंबर के लिए काम किया है।

कोड Math.Round(34.425, 2, MidpointRounding.AwayFromZero) 34.43 के बराबर होना चाहिए, हालांकि, यह 34.42 के बराबर है।

यदि मैं इसे किसी अन्य नंबर से आजमाता हूं तो यह ठीक काम करता है।

Math.Round(34.435, 2, MidpointRounding.AwayFromZero) = 34.44 

Math.Round(34.225, 2, MidpointRounding.AwayFromZero) = 34.23 

Math.Round(34.465, 2, MidpointRounding.AwayFromZero) = 34.47 

मैं सिर्फ यह देखना चाहता था कि कोई इस समस्या में भाग गया है या नहीं?

अभी के लिए मैंने संख्या को दशमलव में परिवर्तित करके इस समस्या को ठीक कर दिया है। मैं इस के लिए कोड बदल दिया है और अब यह ठीक काम करता है:

Math.Round(CDec(34.425), 2, MidpointRounding.AwayFromZero) = 34.43 

मैं सिर्फ क्यों मेरे पुराने कोड काम नहीं किया पर एक कारण के लिए देख रहा हूँ।

धन्यवाद!

सही AwayFromZero

उत्तर

20

चल बिन्दु के लिए कोड है अपडेट किया गया कभी नहीं सही, 34.425 एक आंतरिक represantation 34.4249999999999 .. जो 34.42 तक बढ़ा दिया जाएगा हो सकता है।

यदि आपको संख्याओं के लिए सटीक प्रतिनिधित्व की आवश्यकता है तो decimal प्रकार का उपयोग करें।

+1

दशमलव सुझाव के लिए +1 –

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे लगता है कि मेरा बड़ा सवाल यह है कि यह अन्य सभी मूल्यों के लिए क्यों काम करता है? – Jeff

+0

यदि यह एक चर था तो मुझे भी आपके साथ सहमत होना होगा। हालांकि, मैं इस मूल्य को घड़ी सूची में 34.425 के रूप में डाल रहा था। तो इसे 34.434 99 999 के रूप में प्रदर्शित नहीं किया जाना चाहिए ... क्या यह मेरी धारणा में सही है? – Jeff

2

इस बारे में थोड़ा उलझन में है कि आप वास्तव में MidpointRounding.ToEven या MidpointRounding.AwayFromZero का उपयोग कर रहे हैं या नहीं। यदि आप ToEven का उपयोग कर रहे हैं क्योंकि पहला स्निपेट इंगित करता है, तो यह व्यवहार की अपेक्षा की जाती है।

+0

मैंने इस भ्रम के बारे में खेद व्यक्त किया। – Jeff

1

आपका मान्यताओं और परिणाम सही नहीं हैं:

Math.Round(34.225, 2, MidpointRounding.ToEven) == 34.22 
Math.Round(34.465, 2, MidpointRounding.ToEven) == 34.46 

और

Math.Round(34.425, 2, MidpointRounding.ToEven) == 34.42 

कि यह कैसे काम करता है, और है कि मैं अपने बॉक्स पर क्या मिलता है। यहां तक ​​कि इसका अर्थ यह भी है कि ब्याज की दशमलव जगह पर अगले नंबर तक पहुंचने के लिए ऊपर या नीचे गोल करना।

+0

क्षमा करें मैंने गलत कोड कॉपी किया है। उन सभी को AwayFromZero होना चाहिए। – Jeff

+0

यह केवल तब लागू होता है जब ब्याज की दशमलव स्थान के बाद अगला दशमलव 5 है, और बाद के दशमलव दशमलव शून्य हैं। – phoog

1

कोड Math.Round (34.425, 2, MidpointRounding.ToEven) 34.43 के बराबर होना चाहिए, हालांकि, यह 34.42 के बराबर होना चाहिए।

क्यों? 42 के बाद से भी इसे 34.42 बनाना चाहिए। व्यवहार सही है।

0

मैं vb.net का उपयोग नहीं करता, इसलिए मेरा तर्क गलत हो सकता है, लेकिन आपके पैरामीटर के नाम पर आधारित MidpointRounding.ToEven, मुझे उम्मीद है कि 34.425 को 34.42 तक गोल किया जाएगा; लेकिन मैं 34.225 से 34.22 और 34.465 से 34.46 तक पहुंचने की उम्मीद करता हूं। आपके उदाहरणों में 5 में समाप्त होने वाली संख्याओं का गोलाकार सम्मेलन का विषय है। सबसे सामान्य सम्मेलन एक भी संख्या के लिए गोल है, जिसे मैं तुम्हारा कम कर देता हूं। कुछ भी पैरामीटर अपनाना होगा।

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

अपने इच्छित परिणाम प्राप्त करने के लिए, आपको शायद गोल करने से पहले 5 में समाप्त होने वाले किसी भी अंक पर 0.00001 जोड़ना चाहिए।

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