2012-09-28 11 views
5

मैं सी ++ में गोल करने में त्रुटि को कैसे रोक सकता हूं या इसे ठीक कर सकता हूं?सी ++ में गोल करने में त्रुटि को कैसे रोकें?

उदाहरण:

float SomeNumber = 999.9999; 
cout << SomeNumber << endl; 

यह 1000 प्रिंट!

+0

राउंडिंग मोड के आधार पर, '1000' मेरे लिए सही उत्तर की तरह लगता है। ;-) –

+0

अच्छी तरह से मैं इसे 1000 तक नहीं जाना चाहता हूं, मैं इसे 999.9 999 होना चाहता हूं:/ –

+0

डबल का उपयोग करें क्योंकि 999 बहुत अधिक है 0.9999 –

उत्तर

4

आप परिशुद्धता की स्थापना करके राउंडिंग cout द्वारा किया जाता बदल सकते हैं।

cout.precision(7); 
float SomeNumber = 999.9999; 
cout << SomeNumber << endl; 

वैकल्पिक रूप से, आप cstdio से printf का उपयोग कर सकते हैं।

+0

वाह जो वास्तव में मदद करता है:) (यह इसे 1000 तक नहीं फेंक देगा)। धन्यवाद –

3

डिफ़ॉल्ट रूप से, छह महत्वपूर्ण दशमलव आंकड़ों के std::ostream राउंड फ्लोटिंग प्वाइंट मूल्यों के माध्यम से उत्पादन स्वरूपित। आप सात की जरूरत है अपने संख्या 1000 तक पूर्ण किया जा रहा से बचने के लिए:

cout << setprecision(7) << SomeNumber << endl; 
     ^^^^^^^^^^^^^^^ 

इसके अलावा, सामान्य रूप से प्रयुक्त 32-बिट आईईईई प्रतिनिधित्व संभालने ध्यान रखें कि आप float की शुद्धता की सीमा के करीब हैं हो सकता है,। यदि आपको सात से अधिक महत्वपूर्ण आंकड़ों की आवश्यकता है तो आपको double पर स्विच करने की आवश्यकता होगी। उदाहरण के लिए, निम्नलिखित प्रिंट 1000, कोई फर्क नहीं पड़ता कि आप कितना सटीक निर्दिष्ट करें:

float SomeNumber = 999.99999; // 8 significant figures 
cout << setprecision(10) << SomeNumber << endl; 
0

पहले से, आप केवल अदालत गोलाई सुधार के लिए देख रहे हैं, .precision फ़ंक्शन का उपयोग उल्लेख किया है। आप चल हर संभव अंशों प्रतिनिधित्व करने के लिए अंक की अक्षमता की चर्चा करते हुए कर रहे हैं, नीचे पढ़ें:

आप चल बिन्दु संख्या का उपयोग इस तरह के राउंडिंग त्रुटियों से बचने नहीं कर सकते। आपको अपने डेटा को एक अलग तरीके से प्रस्तुत करने की आवश्यकता है। उदाहरण के लिए, यदि आप परिशुद्धता के 5 अंक चाहते हैं, तो बस इसे एक लंबे समय तक स्टोर करें जो आपकी छोटी इकाइयों की संख्या का प्रतिनिधित्व करता है।

आईई। 5.23524 डब्ल्यू/0.00001 पर परिशुद्धता का प्रतिनिधित्व 523524 के रूप में लंबे समय तक किया जा सकता है (या यदि मूल्यों की आपकी सीमा फिट है)। आप जानते हैं कि इकाइयां 0.00001 हैं ताकि आप इसे आसानी से काम कर सकें।

1

अपने आउटपुट को गोल करने के लिए, iomanip में सेटप्रिजन का उपयोग करें।

float SomeNumber = 999.9999; 
std::cout << SomeNumber << std::endl; //outputs 1000 
std::cout << std::setprecision (7) << SomeNumber << std::endl; //outputs 999.9999 
return 0; 

वास्तविक मूल्य SomeNumber में संग्रहीत हमेशा 999.9999 हो जाएगा, हालांकि, तो आप (जब तक आप अधिक परिशुद्धता से नाव प्रदान करता है की जरूरत है) मान के बारे में चिंता करने की जरूरत नहीं है।

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