2013-10-18 16 views
5

मुझे स्ट्रिंग को डबल में बदलने में समस्या हो रही है। मुझे 33.9425/N 118.4081/Wस्ट्रिंग टू स्ट्रिंग कनवर्ट करना - लॉस प्रेसिजन

के प्रारूप में अक्षांश/लंबे समन्वय के साथ एक स्ट्रिंग दी गई है, मैं पहले अपने फ़ंक्शन trimLastChar(std::string& input) को दो बार कॉल करता हूं, जो उत्तर, दक्षिण, पूर्व, पश्चिम वर्णों और फिर आगे की स्लैश को हटा देगा। यह फ़ंक्शन 33.9425 और 118.4081 सम्मानपूर्वक std::string के रूप में सम्मानित करता है।

मैं अपने std::string को double में कनवर्ट करने के लिए निम्न कोड का उपयोग कर रहा हूं ... हालांकि समस्या यह है कि रूपांतरण हानि परिशुद्धता - मुझे संदेह है कि यह गोलाकार हो जाता है?

// Location In String is what trimLastChar returns 
std::stringstream stream(locationInString); 
std::cout << "DEBUG: before: " << locationInString << " "; 
// output is a double* output = new double passed by reference to my function 
stream >> output; 
std::cout << output << std::endl; 

इस मामले में उत्पादन होगा उत्पादन:

33.9425 
118.408 

तुम नोटिस के रूप में, सही मान 118.4081 होना चाहिए लेकिन 1 याद आ रही है ...

कोई भी विचार कैसे तय करने के लिए? या अधिक महत्वपूर्ण, यह क्यों हो रहा है?

+2

... आप अपने उत्पादन प्रारूप की जांच होनी चाहिए, मुझे लगता है कि हम इस अदालत पर सिर्फ एक स्वरूपण समस्या है। – IdeaHat

उत्तर

7

इनपुट पर सटीकता खो गई नहीं है। यह आउटपुट पर खो जा रहा है।

#include <iostream> 
using std::cout; 
using std::endl; 
int main() 
{ 
    double v = 118.4081; 
    cout << v << endl; 
    cout.precision(10); 
    cout << v << endl; 
} 

आउटपुट:

$ g++ -Wall x.cpp && ./a.out 
118.408 
118.4081 
$ 
+0

धन्यवाद ... यह चाल है! – Adam

3

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

std::cout << std::setprecision(10) << output << std::endl; 
संबंधित मुद्दे