2011-01-24 17 views
5

C++ nie jest moim językiem, więc wybacz ten prosty problem. Tracę precyzję w konwersji atofa z ciągu na podwójny, czy ktoś może pomóc?C++ Konwersja na podwójną konwersję tracąc precyzję?

string lAmount; 

string lSuspendedInt = "131663.51"; 
string lAccruedInterest = "0.0"; 
double dSuspendedInt= atof(lSuspendedInt.c_str()); //PROBLEM HERE? 
double dAccruedInterest = atof(lAccruedInterest.c_str()); 
double dTotal = dSuspendedInt + dAccruedInterest; 

char cAmount[50]; 

memset(cAmount,0X00,sizeof(cAmount)); 
    sprintf(cAmount,"%g*",dTotal); 
    lAmount = cAmount; 


cout << "lAmount: "<<lAmount<<endl; //PRINTING: 131664 not 131663.51 

Grałem z% f w funkcji memset jednak daje 131663.510000

Z góry dzięki.

Sapatos

+0

Gdybym potrzebował tej dokładnej kwoty, rozważałbym użycie zamiast niej stałego punktu. Po stronie C++, jestem pewien, że istnieją lepsze sposoby na konwersję ciągu znaków na podwójne oprócz atof. sprintf() to kolejny sposób na zrobienie tego również, jeśli uważasz, że problem istnieje. Jako komentarz, ponieważ nie mam tutaj dokładnej odpowiedzi. –

+1

@ Michael: można używać strumieni, choć jest nieporęczny, C++ 0x wprowadza określone instrukcje 'stof' (i całej rodziny) jako część Biblioteki Standardowej. –

Odpowiedz

3

Problem dotyczy operatora formatu %g, który nie został określony z wystarczającą dokładnością. Zamiast tego możesz potrzebować %.2f, która drukuje dwie cyfry po przecinku dziesiętnym.

+0

thansk, który działa – sapatos

2

W sprintf Format %g specifier domyślnie drukuje sześć cyfr znaczących. Jeśli chcesz więcej, można jednoznacznie określić, ile powinno być wydrukowane:

sprintf(cAmount,"%.8g*",dTotal); 
1

Funkcja atof tworzy podwójne. Zobacz here. Twój problem polega na tym, że %g zwraca albo krótszy czas pływania, albo notację naukową. Zobacz here. Zauważ również, że dodajesz notację *, która oznacza, że ​​oczekiwane jest skrócenie liczby drukowanych znaków.

+0

the * to literówka :( – sapatos

+0

Notacja '* 'musiałaby być zanim specyfikator konwersji miałby jakikolwiek wpływ ... tak jak jest drukowany jako zwykły znak. –

Powiązane problemy