2008-12-04 8 views
5

यह देखते हुए कि Decimal.MaxValue = 79228162514264337593543950335mदशमलव राउंडिंग समस्याओं

क्यों अगली पंक्ति मुझे स्थानीय खिड़की के बजाय 7922816251426433759354395033.5m में 7922816251426433759354395034M देता है के रूप में उम्मीद?

दशमलव लक्ष्य = दशमलव। मैक्सवेल्यू/10 मीटर;

उत्तर

6

मुझे संदेह है कि यह वास्तव में एक कंपाइलर त्रुटि है।

यहाँ दिखाने के लिए एक छोटा लेकिन पूरा कार्यक्रम इसलिए मुझे लगता है कि:

using System; 

class Test 
{ 
    static void Main() 
    { 
     decimal constant = decimal.MaxValue/10m; 
     decimal calculated = decimal.MaxValue; 
     calculated /= 10m; 

     Console.WriteLine (constant); 
     Console.WriteLine (calculated);   
    } 
} 

आउटपुट:

7922816251426433759354395034 
7922816251426433759354395033.5 

मैं कल्पना में खुदाई करेंगे देखने के लिए क्या गारंटी दी जाती है।

संपादित करें: कल्पना में, खंड 7.18 का दावा है:

निरंतर अभिव्यक्ति के संकलन समय मूल्यांकन गैर निरंतर अभिव्यक्ति के रन-टाइम मूल्यांकन के रूप में ही नियमों का उपयोग करता है, कि जहां को छोड़कर रन-टाइम मूल्यांकन में एक अपवाद फेंक दिया जाएगा, संकलन-समय मूल्यांकन एक संकलन-समय त्रुटि होने का कारण बनता है।

यह स्पष्ट रूप से यहां मामला नहीं है। हम्म।

संपादित करें: मैंने a bug to Microsoft Connect सबमिट किया है। हम देखेंगे कि इसके साथ क्या होता है।

+0

यह जोर से विभाजित कर रहे हैं अतिक्रमण कर रहे हैं असफल: Assert.IsTrue (Decimal.MaxValue/10 मी == 7922816251426433759354395033.5m); – izokurew

+0

यूप, यह लगातार जांच कर रहा है। असल में संकलक निरंतर अंकगणित यहां गलती है, मुझे विश्वास है। –

0

मुझे लगता है कि चाहते हैं क्योंकि आप अधिकतम परिशुद्धता मूल्य जब आप 10 http://en.wikipedia.org/wiki/Arithmetic_precision

+0

नहीं, परिशुद्धता वही है, क्योंकि हम दशमलव प्रकार का उपयोग कर रहे हैं। यह आसानी से ध्यान देने में सक्षम होना चाहिए कि विभाजन शून्य से है, मंटिसा को वही रखें और केवल एक्सपोनेंट बदलें। दशमलव के रूप में सटीक परिणाम का प्रतिनिधित्व करना पूरी तरह से संभव है। –

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