2010-03-22 12 views
12

¿Hay alguna forma de establecer el número "mínimo" de decimales que generará std :: ostream?Configuración del número mínimo de decimales para std :: ostream precision

Por ejemplo, decir que tengo dos variables dobles desconocidos que quiero imprimir (valores añadidos aquí en aras de la ilustración):

double a = 0; 
double b = 0.123456789; 

puedo configurar mi máxima precisión decimal de modo que la producción me b exactamente

std::cout << std::setprecision(9) << b << std::endl; 
>>> 0.123456789 

¿hay una manera de establecer una precisión "mínimo" (un número mínimo de decimales), al tiempo que conserva la precisión "máximo", por lo que

std::cout << a << std::endl << b << std::endl; 

rendimientos

0.0 
0.123456789 

no

0 
0.123456789 

?

Gracias! Phil


la respuesta corta a esto es "No". La transmisión tiene solo una configuración de precisión, sin posibilidad de diferenciar entre precisión máxima y mínima. ¡Gracias a todos por sus generosos consejos!

+0

Lea la pregunta con cuidado. Phil quiere un MÍNIMO de 1 dígito de precisión después del punto decimal, pero más si hay dígitos que no sean cero. – Oddthinking

+1

@Phil: Puede encontrar http://stackoverflow.com/questions/2475642/how-to-achieve-the-following-c-output-formatting útil. –

+0

Gracias Roger. Eso es muy útil. Su ejemplo de formateador parece ser el camino correcto a seguir. –

Respuesta

0

No creo que hay una manera de lograr lo que están pidiendo sin convertir el número en una cadena (con alta precisión), y despojarse de los ceros que se arrastran.

Esto es apropiado, porque el hecho de que haya ceros finales no significa que no haya precisión allí, y el tiempo de ejecución no puede decir eso.

Por ejemplo, si mido el peso de un objeto con una balanza barata, puede ser de 1.0 kg.

Si peso con una escala de alta precisión, puede ser de 1.00000 kg. El hecho de que haya ceros al final no significa que deba descartarse la precisión.

+0

+1, aunque todavía no está claro para mí lo que él quiere exactamente, más allá de que el cero sea exactamente "0.0". –

+1

Nada más que eso, Roger. Tengo un requisito de que los flotadores o el doble estén representados en la secuencia de salida con un lugar decimal y estoy buscando una manera de hacerlo elegantemente sin implicar el tipo de precisión a la que se refiere Oddthinking. Por lo tanto, 0 debe representarse como 0.0, no 0.0000 ... –

+0

@Phil: ¿Qué pasa con 0.12, se genera como "0.120000" bien? ¿Por qué no está "0.000000" bien? (¿Exactamente qué requisito falla?) –

2
cout << setprecision(1) << fixed << d << endl; 

Se utiliza fijo después de setprecision.

Editar: Esto es lo que quieres. Cambiaría la precisión según d.

cout << setprecision(d?9:1) << fixed << d << endl; 
+0

Gracias Sameer. Sin embargo, eso supone que sé de antemano que d = 0. ¿Hay una solución para un d arbitrario que imprimiría "0.0" si d = 0, pero "0.123456789" si d = 0.123456789? –

+0

@Phil: la transmisión solo tiene una configuración de precisión. Podrías verificar el valor antes de que lo generes, y sacar tu '" 0.0 "' luego (nota que es un literal de cadena, no un doble). –

+0

Puedes hacer algo como esto. cout << setprecision (d?9: 1) << fijo << d << endl; – Sameer

Cuestiones relacionadas