2011-12-18 33 views

Respuesta

15

Utilice setf y precision.

#include <iostream> 

using namespace std; 

int main() { 
    double f = 3.14159; 
    cout.setf(ios::fixed,ios::floatfield); 
    cout.precision(3); 
    cout << f << endl; 
    return 0; 
} 

Esto imprime 3.142

+0

Gracias. Fue útil para mí. – ozeron

+0

Esto funciona para 3.14159 pero no funciona para 13.14159. Su solución solo funciona para números menores que 10. – mantler

+0

@manler Tiene razón, mi publicación original no, pero la última (la que edité hace 11 minutos) funciona correctamente. Lo verifiqué con 2 y 3 dígitos antes del punto decimal, e imprime 3 dígitos como se esperaba. – dasblinkenlight

6

Ésta no mostrar "13.141"

#include <iostream> 
#include <iomanip> 
using namespace std; 

int main(){ 
    double f = 13.14159; 
    cout << fixed; 
    cout << setprecision(3) << f << endl; 
    return 0; 
} 
4

Puede obtener el número de dígitos fraccionarios (y muchas otras cosas) fija mediante el uso de la cabecera iomanip. Por ejemplo:

#include <iostream> 
#include <iomanip> 

int main() { 
    double pi = 3.141592653589; 
    std::cout << std::fixed << std::setprecision(2) << pi << '\n'; 
    return 0; 
} 

la Salida:

3.14 

Tenga en cuenta que tanto fixed y setprecision cambio de la corriente de forma permanente por lo que, si se desea localizar los efectos, puede guardar la información de antemano y restaurarlo posteriormente :

#include <iostream> 
#include <iomanip> 

int main() { 
    double pi = 3.141592653589; 

    std::cout << pi << '\n'; 

    // Save flags/precision. 
    std::ios_base::fmtflags oldflags = std::cout.flags(); 
    std::streamsize oldprecision = std::cout.precision(); 

    std::cout << std::fixed << std::setprecision(2) << pi << '\n'; 
    std::cout << pi << '\n'; 

    // Restore flags/precision. 
    std::cout.flags (oldflags); 
    std::cout.precision (oldprecision); 

    std::cout << pi << '\n'; 

    return 0; 
} 

La salida del que es:

3.14159 
3.14 
3.14 
3.14159 
+0

Gracias por mostrar cómo guardar y restaurar la configuración de la transmisión, muy útil. – bhaller

+0

use esta línea "using namespace std;" para obtener más código de limpieza –

+0

@Khaled, existen argumentos a favor y en contra de eso que son lo suficientemente complejos como para que no encajen dentro de un cuadro de comentarios :-) Yo prefiero los espacios de nombres explícitos para todos menos los programas más simples o, como mínimo, el uso de elementos específicos * dentro de * un espacio de nombres en lugar de importar todo el lote. Sin embargo, esa discusión particular es tangencial a la pregunta y mi respuesta. – paxdiablo

Cuestiones relacionadas