Stampa del numero corretto di punti decimali con cout


133

Ho un elenco di floatvalori e voglio stamparli coutcon 2 cifre decimali.

Per esempio:

10.900  should be printed as 10.90
1.000 should be printed as 1.00
122.345 should be printed as 122.34

Come posso fare questo?

( setprecisionnon sembra aiutare in questo.)

Risposte:


196

Con <iomanip>, puoi usare std::fixedestd::setprecision

Ecco un esempio

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;

    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    std::cout << d;
}

E otterrai l'output

122.34

6
perché hai usato "std: fixed" nel programma?
Vilas Joshi,

1
A tale scopo è possibile definire un'intestazione utile #define FIXED_FLOAT(x) std::fixed <<std::setprecision(2)<<(x) che semplifica l'utilizzo di:cout<<FIXED_FLOAT(d)
Udayraj Deshmukh,

13
@VilasJoshi, setprecision imposta il numero di cifre dopo il decimale, se ci sono 5 cifre e usiamo setprecision (2) otterremo 2 cifre, ma se ci sono 0 cifre non ne mostrerà nessuna, usando fixed fissiamo che molte cifre hanno per essere mostrato così 5 sarà rappresentato come 5.00 no 5
vaibnak

43

Eri quasi lì, è necessario utilizzare anche std :: fixed, consultare http://www.cplusplus.com/reference/iostream/manipulators/fixed/

#include <iostream>
#include <iomanip>

int main(int argc, char** argv)
{
    float testme[] = { 0.12345, 1.2345, 12.345, 123.45, 1234.5, 12345 };

    std::cout << std::setprecision(2) << std::fixed;

    for(int i = 0; i < 6; ++i)
    {
        std::cout << testme[i] << std::endl;
    }

    return 0;
}

uscite:

0.12
1.23
12.35
123.45
1234.50
12345.00

18

setprecision(n)si applica all'intero numero, non alla parte frazionaria. È necessario utilizzare il formato a virgola fissa per applicarlo alla parte frazionaria:setiosflags(ios::fixed)


12

Semplifica la risposta accettata

Esempio semplificato:

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;
    std::cout << std::fixed << std::setprecision(2) << d;
}

E otterrai l'output

122.34

Riferimento:


Questo ha funzionato per me: std :: cout << std :: setprecision (2) << std :: fixed << d;
Andrea Girardi,

5

Ho avuto un problema con gli interi mentre volevo una formattazione coerente.

Una riscrittura per completezza:

#include <iostream>
#include <iomanip>

int main()
{
    //    floating point formatting example

    double d = 122.345;
    cout << std::fixed << std::setprecision(2) << d << endl;
    //    Output:  122.34


    //    integer formatting example

    int i = 122;
    cout << std::fixed << std::setprecision(2) << double(i) << endl;
    //    Output:  122.00
}

Ti manca std :: proprio prima di cout ed endl poiché non stai utilizzando lo spazio dei nomi.
Blackforest-tom

@ blackforest-tom - Forse hai ragione, non riesco a ricordare --- Generalmente copio e incollo i programmi di lavoro, quindi questo potrebbe essere stato eseguito così com'è in Visual Studio o da qualche altra parte.
Manohar Reddy Poreddy,

3

Ho avuto questo problema simile in una competizione di programmazione ed è così che l'ho gestita. Impostare una precisione di 2 su tutti i valori doppi

Innanzitutto aggiungendo l'intestazione per usare setprecision

#include <iomanip>

Quindi aggiungendo il seguente codice nel nostro principale

  double answer=5.9999;
  double answer2=5.0000;
  cout<<setprecision(2)<<fixed;
  cout <<answer << endl;
  cout <<answer2 << endl;

Produzione:

5.99
5.00

Devi usare fixed per scrivere 5.00, ecco perché il tuo output non arriverà per 5.00.

Un breve collegamento video di riferimento che sto aggiungendo è utile


2

Devi impostare la 'modalità float' su fisso.

float num = 15.839;

// this will output 15.84
std::cout << std::fixed << "num = " << std::setprecision(2) << num << std::endl;

1

Per impostare 2 cifre fisse dopo il punto decimale, utilizzare prima queste:

cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);

Quindi stampa i tuoi doppi valori.

Questo è un esempio:

#include <iostream>
using std::cout;
using std::ios;
using std::endl;

int main(int argc, char *argv[]) {
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout.precision(2);
    double d = 10.90;
    cout << d << endl;
    return 0;
}

1
#include<stdio.h>
int main()

{

 double d=15.6464545347;

printf("%0.2lf",d);

}

0

con modelli

#include <iostream>

// d = decimal places
template<int d> 
std::ostream& fixed(std::ostream& os){
    os.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    os.precision(d); 
    return os; 
}

int main(){
    double d = 122.345;
    std::cout << fixed<2> << d;
}

simile anche per scopi scientifici, con un'opzione di larghezza (utile per le colonne)

// d = decimal places
template<int d> 
std::ostream& f(std::ostream &os){
    os.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    os.precision(d); 
    return os; 
}

// w = width, d = decimal places
template<int w, int d> 
std::ostream& f(std::ostream &os){
    os.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    os.precision(d); 
    os.width(w);
    return os; 
}

// d = decimal places
template<int d> 
std::ostream& e(std::ostream &os){
    os.setf(std::ios_base::scientific, std::ios_base::floatfield); 
    os.precision(d); 
    return os; 
}

// w = width, d = decimal places
template<int w, int d> 
std::ostream& e(std::ostream &os){
    os.setf(std::ios_base::scientific, std::ios_base::floatfield); 
    os.precision(d); 
    os.width(w);
    return os; 
}

int main(){
    double d = 122.345;
    std::cout << f<10,2> << d << '\n'
        << e<10,2> << d << '\n';
}

-3

Solo un punto minore; inserisci quanto segue nell'intestazione

usando lo spazio dei nomi std;

poi

std :: cout << std :: fixed << std :: setprecision (2) << d;

diventa semplificato a

cout << fisso << setprecision (2) << d;


2
Sì, diventa "semplificato", ma questo è fortemente scoraggiato. Per favore, non usare using namespace std;per il gusto di farlo - capisci perché lo stai facendo.
Carlos F,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.