2012-06-06 10 views
9

निम्नलिखित स्निपेट आउटपुट ०.२९८४७ जब मैं .२९,८४८ अपेक्षा की होगी:सी ++ दौर में सेटप्रिजन है? यदि ऐसा है तो मैं इसे क्यों देख रहा हूं?

double f = 0.298475; 
cout << setprecision(5) << f << endl; 

अन्य उदाहरण के लिए, तथापि, मैं गोलाई पर ध्यान दें:

double f = 0.123459; 
cout << setprecision(5) << f << endl; 

आउटपुट: 0,12346

और

double f = 0.123454; 
cout << setprecision(5) << f << endl; 

आउटपुट: 0.12345

उत्तर

16

संख्या 0.298475 एक double में बिल्कुल प्रदर्शनीय नहीं है (यह एक अंश जिसका हर दो में से एक शक्ति है नहीं है के बाद से, 11939/40000 जा रहा है), और वास्तविक संख्या कि संग्रहीत किया जाता है वास्तव में से .२९,८४७ के करीब है 0.2 9 848 तक।

+4

0.298474999999999990318855225268634967505931854248046875, सटीक होने के लिए। – dan04

+1

दूसरे शब्दों में, वास्तव में दो गोल चरण हैं: एक जब शाब्दिक '0.298475' को 'डबल' में परिवर्तित किया जाता है, और दूसरा 'cout' में कुछ अंकों को प्रिंट करते समय। – aschepler

+2

@ dan04: यह कुछ हद तक व्यर्थ प्रदर्शन है; एक 64-बिट आईईईई 754 फ्लोट में केवल 17 दशमलव अंकों की जानकारी है ... –

1

जहां तक ​​मैं प्रलेखन सेटप्रिजन() से देख सकता हूं, कोई गोल नहीं करता है, लेकिन दशमलव बिंदु के बाद प्रदर्शित अंकों की अधिकतम संख्या निर्धारित करता है। डबल और फ्लोट नंबरों के संभावित प्रतिनिधित्व आपके द्वारा उपयोग किए जाने वाले निरंतर प्रारंभकर्ताओं से भिन्न हो सकते हैं।

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

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