2013-10-18 17 views
5

Mam problem z przekonwertowaniem ciągu znaków na podwójne. Dostaję ciąg z długimi współrzędnymi w formacie 33.9425/N 118.4081/WKonwertowanie ciągu na podwójne - utrata precyzji

Najpierw dwukrotnie wywołuję moją funkcję trimLastChar(std::string& input), co spowoduje usunięcie znaków Północ, Południe, Wschód, Zachód, a następnie ukośnik. Ta funkcja poprawnie zwraca 33.9425 i 118.4081 z szacunkiem jako std::string.

Korzystam z następującego kodu, aby przekonwertować mój std::string na double ... jednak problem polega na precyzji strat konwersji - podejrzewam, że zostanie zaokrąglona ?.

// 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; 

Wyjście w tym przypadku będzie produkować:

33.9425 
118.408 

Jak można zauważyć, prawidłowa wartość powinna być 118.4081 ale 1 brakuje ...

Jakieś pomysły jak to naprawić? A co ważniejsze, dlaczego tak się dzieje?

+2

... należy sprawdzić format wyjściowy, to myślę, że jest to tylko problem formatowania na cout. – IdeaHat

Odpowiedz

7

Precyzja nie została utracona na wejściu. Jest zagubiony na wyjściu.

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

wyjścia:

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

dzięki ... to się udało! – Adam

3

Prawdopodobnie masz więcej cyfr niż dane wyjściowe. Domyślnie wyświetlana jest tylko niewielka liczba cyfr. Aby uzyskać więcej cyfr, musisz użyć numeru std::setprecision. Wypróbuj

std::cout << std::setprecision(10) << output << std::endl; 
Powiązane problemy