Imprimir o número correto de casas decimais com cout

133

Eu tenho uma lista de floatvalores e quero imprimi-los coutcom 2 casas decimais.

Por exemplo:

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

Como posso fazer isso?

( setprecisionparece não ajudar nisso.)

thameera
fonte

Respostas:

195

Com <iomanip>, você pode usar std::fixedestd::setprecision

Aqui está um exemplo

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;

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

E você obterá saída

122.34
beduíno
fonte
6
por que você usou "std: fixed" no programa?
Vilas Joshi
1
Um cabeçalho útil pode ser definida para isso: #define FIXED_FLOAT(x) std::fixed <<std::setprecision(2)<<(x) o que simplifica o uso de:cout<<FIXED_FLOAT(d)
Udayraj Deshmukh
12
@VilasJoshi, setprecision defina o número de dígitos após o decimal, se houver 5 dígitos e usarmos setprecision (2) obteremos 2 dígitos, mas se houver 0 dígitos ele não mostrará nenhum, usando fixo, corrigimos que muitos dígitos têm seja mostrado para que 5 seja representado como 5,00 no 5
vaibnak
43

Você estava quase lá, também precisa usar std :: fixed, consulte 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;
}

saídas:

0.12
1.23
12.35
123.45
1234.50
12345.00
Vusak
fonte
18

setprecision(n)aplica-se ao número inteiro, não à parte fracionária. Você precisa usar o formato de ponto fixo para aplicá-lo à parte fracionária:setiosflags(ios::fixed)

QuantumMechanic
fonte
12

Simplifique a resposta aceita

Exemplo simplificado:

#include <iostream>
#include <iomanip>

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

E você obterá saída

122.34

Referência:

einverne
fonte
Isso funcionou para mim: std :: cout << std :: setprecision (2) << std :: fixed << d;
Andrea Girardi
5

Eu tive um problema com números inteiros enquanto desejava uma formatação consistente.

Uma reescrita para completar:

#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
}
Manohar Reddy Poreddy
fonte
Você está perdendo std :: logo antes do cout e endl, pois você não está usando o espaço para nome.
blackforest-tom
@ blackforest-tom - Talvez você esteja certo, não se lembra - eu geralmente copio e colo programas de trabalho, então isso pode ter sido executado como está no Visual Studio ou em outro lugar.
Manohar Reddy Poreddy 9/10/19
3

Eu tive esse problema semelhante em uma competição de codificação e foi assim que eu lidei com isso. Definir uma precisão de 2 para todos os valores duplos

Primeiro adicionando o cabeçalho para usar setprecision

#include <iomanip>

Em seguida, adicione o seguinte código em nosso principal

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

Resultado:

5.99
5.00

Você precisa usar fixo para escrever 5,00, por isso, sua saída não chegará a 5,00.

Um breve link de vídeo de referência que estou adicionando é útil

Hargun Singh
fonte
2

Você precisa definir o 'modo flutuante' como fixo.

float num = 15.839;

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

Para definir 2 dígitos fixos após o ponto decimal, use-os primeiro:

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

Em seguida, imprima seus valores duplos.

Isto é um exemplo:

#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;
}
Hamid Rohani
fonte
1
#include<stdio.h>
int main()

{

 double d=15.6464545347;

printf("%0.2lf",d);

}
saurav52
fonte
0

com modelos

#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;
}

semelhante também para o científico, com uma opção de largura (útil para colunas)

// 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';
}
QuentinUK
fonte
-3

Apenas um ponto menor; coloque o seguinte no cabeçalho

usando espaço para nome std;

então

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

torna-se simplificado para

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

Davidjgw
fonte
2
Sim, torna-se "simplificado", mas isso é fortemente desencorajado. Por favor, não o use using namespace std;- entenda por que você está fazendo isso.
Carlos F
-6

este é um exemplo usando uma matriz.

cout<<setprecision(4)<<fixed<<m[i][j]
Luis Enrique Martinez
fonte