2011-01-24 18 views
5

C++ no es mi idioma, así que perdona este simple problema. Estoy perdiendo precisión en una conversión de cadena a doble, ¿alguien puede ayudarme?C++ Cadena para duplicar la conversión de atof perdiendo precisión?

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 

He jugado con f% en la función memset sin embargo, esto da 131663.510000

Gracias de antemano.

Sapatos

+0

Si necesitara esta cantidad exacta, consideraría usar un punto fijo en su lugar. En el lado de C++, estoy seguro de que hay mejores formas de convertir cadenas en dobles además de atof. sprintf() es otra forma C de hacerlo también si crees que el problema está ahí. Como comentario, ya que no tengo una respuesta exacta aquí para ti. –

+1

@Michael: uno puede usar transmisiones, aunque es voluminoso, C++ 0x presenta instrucciones específicas de 'stof' (y toda la familia) como parte de la Biblioteca estándar. –

Respuesta

3

El problema es su operador de formato %g, que no se especifica con suficiente precisión. Es posible que desee %.2f, que imprime dos dígitos después del punto decimal.

+0

thansk que funciona – sapatos

2

Los sprintf%g especificador de formato por defecto es imprimir seis dígitos significativos. Si quieres más, puede especificar explícitamente el número debe ser impreso:

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

La función atof crea un doble. Ver here. Su problema es que el %g devuelve el valor flotante o la notación científica más corta. Ver here. También tenga en cuenta que está agregando la notación * que significa que hay un truncamiento esperado en el número de caracteres impresos.

+0

el * era un error tipográfico :( – sapatos

+0

La notación '*' tendría que estar antes del especificador de conversión para tener algún efecto de todos modos ... como es que acaba de imprimirse como un carácter normal. –

Cuestiones relacionadas