2012-04-26 12 views
5

Tengo un problema específico al convertir los valores double en una cadena usando sprintf() en UNIX.formateo sprintf de doble valor

Por ejemplo, tengo dos valores:

double a = 0.009984354523452; 
double b = 0.01; 

Si bien la conversión, estoy usando:

sprintf(somestringvar, "Double value : %.15f \n", a); 
sprintf(diffstringvar, "Double value : %.15f \n", b); 

a convertir en una cadena.

Mi problema es para la 'a', el valor se imprime correctamente, pero para el valor de 'b', los 0 se añaden al final. Proporcione cualquier forma común de representar 'a' y 'b' como valores exactos.

+1

Usaría std :: ostringstream para este tipo de cosas. – Robinson

+1

Y, en general, no use 'sprintf()', ya que puede llevar a sobrepasar el búfer. Utilice 'snprintf()' en su lugar, o una de las '' versiones '' seguras '' que Microsoft proporciona en Windows. PD. Bienvenido a Stack Overflow! –

+0

Hola, gracias por las respuestas tempranas. ostringstream no está tomando toda la precisión. un valor se imprime como 0.009976 solamente. Puedo usar snprintf() pero el problema es al imprimir valores correctamente. – sandy

Respuesta

8

Obtiene ceros cuando imprime b porque le indicó a printf que imprima 15 decimales (%.15f), y lo hace obedientemente. Para obtener algo "exacto", es posible que tengas mejor suerte con el simple %g.


[Actualización sobre la base de los comentarios recientes]

cosas realmente depende de lo que entendemos por "exacta". Si por exacto, te refieres a "lo que el usuario ingresó originalmente", entonces un doble podría no ser la mejor opción para ti. Quizás pueda funcionar el almacenamiento del valor como una cadena y luego convertirlo a un doble cuando necesite usarlo en un cálculo. Una vez que un número decimal basado en texto se convierte en un doble, generalmente ya no es exactamente el mismo que el texto. Si bien printf() o ostream imprimen diligentemente lo que tiene el doble (y a veces tiene suerte y lo que imprime tiene el mismo aspecto que el valor original), el problema es que el doble ya no tiene el valor original real. Y de hecho nunca lo hizo.

Alternativamente, podría preferir una implementación numérica precisa en lugar de algo inherentemente aproximado como el doble. Por ejemplo, MySQL tiene tipos NUMERIC and DECIMAL que admiten una precisión perfecta a costa de forzarle a especificar el número de lugares enteros y decimales con anticipación. Esto se llama arbitrary precision arithmetic y hay bibliotecas para hacer esto en C/C++.

+0

Gracias por la respuesta puedo entender la parte lógica para la adición de zeoes. Pero el problema es que en tiempo de ejecución debería leer los valores de la base de datos. Los valores pueden ser de cualquier tipo como se muestra arriba, de modo que estoy buscando una forma general de imprimir valores exactos. Intenté '% g' incluso está normalizando el valor 'a' a 0.009976 – sandy

+0

¿Por qué la gente sigue votando esto? Si hay un problema, háblame para poder mejorarlo o proporcionar una respuesta alternativa. –