2009-05-19 9 views
6

में 0.1 की प्रिंटिंग वृद्धियां वर्तमान में स्टीव मैककनेल द्वारा कोड पूर्ण को पढ़ रही है, विशेष रूप से पृष्ठ 2 9 5 फ्लोटिंग-पॉइंट नंबरों पर।सी #

जब मैं निम्नलिखित कोड भाग गया:

 double nominal = 1.0; 
     double sum = 0.0; 

     for (int i = 0; i < 10; i++) 
     { 
      sum += 0.1; 
      Console.WriteLine("sum: " + sum.ToString()); 
     } 

     if (equals(nominal,sum)) 
     { 
      Console.WriteLine("Numbers are the same"); 
     } 
     else 
     { 
      Console.WriteLine("Numbers are different"); 
     } 

मैं 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 का प्रिंट आउट मिला 0.9 1.0 नंबर अलग हैं

मैं कैसे ' ऐसा लगता है कि उत्पादन होने वाला अनुमान है? अर्थात्: 0,1 0,2 0,30000000000000004 0,4 0,5 0,6 0,7 0,79999999999999999 0,89999999999999999 0,99999999999999999 नंबर अलग

सी # राउंडिंग संख्या है जब मैं स्ट्रिंग के लिए डबल से एक अंतर्निहित रूपांतरण कर रहे हैं? मुझे ऐसा लगता है क्योंकि जब मैं एप्लिकेशन को डीबग करता हूं और लूप के माध्यम से कदम उठाता हूं, तो मैं गैर-समाप्ति दोहराव दशमलव संख्या देख सकता हूं। तुम क्या सोचते हो? क्या मैं सही हूं या गलत हूं?

उत्तर

12

डबल.ToString() सामान्य प्रारूप का उपयोग करता है जो सटीक निर्दिष्ट नहीं होने पर 15 दशमलव स्थानों पर डिफ़ॉल्ट होता है। तो यह थोड़ा गोल करता है, यही कारण है कि आप जो देख रहे हैं उसे देख रहे हैं। उदाहरण के लिए 0.899 99 99 99 99 99 99 99 जो आपने अपने प्रश्न में निर्दिष्ट किया है वह 17 दशमलव स्थान है। आप sum.ToString("g17") कर वास्तव में पूरा नंबर देख सकते हैं।

आप .net के मानक संख्यात्मक स्वरूप स्ट्रिंग्स और उनके डिफ़ॉल्ट यहाँ परिशुद्धता पा सकते हैं: http://msdn.microsoft.com/en-us/library/dwhawy9k(VS.80).aspx

+0

आह धन्यवाद। मुझे आपके द्वारा दिए गए आउटपुट के साथ बहुत सटीक होना चाहिए था। जब मैंने 0.7 99 99 99 99 99 99 99 99 जैसे लंबी दशमलव संख्याएं दीं, तो मैं उन अंकों की संख्या पर ध्यान नहीं दे रहा था जिनका उपयोग मैं कर रहा था। – burnt1ce

2

यह है ToString डिफ़ॉल्ट व्यवहार में है। आप डीबगर में योग को देखें, तो आप ToString के माध्यम से मार्ग के बिना जो आप मूल्य से पता चलता यह मिलता है,:

0.0 
0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.79999999999999993 
0.89999999999999991 

का संकेत है कि अंतर्निहित व्यवहार के रूप में आप उम्मीद करेंगे है।

hth

2

संक्षिप्त उत्तर है: यह चल रहा है बिंदु है, तो कुछ भी पर भरोसा नहीं है, लेकिन यह सही ("सही" की उपयुक्त मूल्यों के लिए) किया जा रहा है! लंबे उत्तर देने वाला यह समझना है कि कैसे फ़्लोटिंग पॉइंट काम करता है और कैसे लोग फ़्लोटिंग पॉइंट के साथ काम करते हैं। आईआईआरसी जीएनयू प्रिंटफ (और दूसरों को मैं मानता हूं) विशेष मामला "वास्तव में वास्तव में एक अच्छा आधार 10 संख्या के करीब"।