Drukowanie prawidłowej liczby miejsc dziesiętnych za pomocą cout


143

Mam listę floatwartości i chcę je wydrukować coutz 2 miejscami po przecinku.

Na przykład:

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

Jak mogę to zrobić?

( setprecisionnie wydaje się pomagać w tym.)

Odpowiedzi:


213

Dzięki <iomanip>, można użyć std::fixedistd::setprecision

Oto przykład

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;

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

Otrzymasz wynik

122.34

8
dlaczego użyłeś "std: fixed" w programie?
Vilas Joshi

2
Można w tym celu zdefiniować przydatny nagłówek: #define FIXED_FLOAT(x) std::fixed <<std::setprecision(2)<<(x) co upraszcza użycie do:cout<<FIXED_FLOAT(d)
Udayraj Deshmukh

15
@VilasJoshi, setprecision ustaw liczbę cyfr po przecinku, jeśli jest 5 cyfr i używamy setprecision (2) otrzymamy 2 cyfry, ale jeśli jest 0 cyfr to nie pokaże żadnych, używając fixed naprawimy, że wiele cyfr ma do pokazania, więc 5 będzie reprezentowanych jako 5.00 nr 5
vaibnak

44

Już prawie byłeś, musisz też użyć std :: fixed, zobacz 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;
}

wyjścia:

0.12
1.23
12.35
123.45
1234.50
12345.00

19

setprecision(n)dotyczy całej liczby, a nie części ułamkowej. Musisz użyć formatu stałego punktu, aby zastosować go do części ułamkowej:setiosflags(ios::fixed)


14

Uprość zaakceptowaną odpowiedź

Uproszczony przykład:

#include <iostream>
#include <iomanip>

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

Otrzymasz wynik

122.34

Odniesienie:


U mnie to zadziałało: std :: cout << std :: setprecision (2) << std :: fixed << d;
Andrea Girardi

6

Wystąpił problem z liczbami całkowitymi, gdy potrzebowałem spójnego formatowania.

Przepisanie dla kompletności:

#include <iostream>
#include <iomanip>

int main()
{
    //    floating point formatting example

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


    //    integer formatting example

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

1
Brakuje std :: tuż przed cout i endl, ponieważ nie używasz przestrzeni nazw.
blackforest-tom

@ blackforest-tom - Może masz rację, nie pamiętam --- Generalnie kopiuję i wklejam działające programy, więc może to działać tak, jak jest w Visual Studio lub gdzie indziej.
Manohar Reddy Poreddy

Ponieważ pojawiły się nowe głosy za, dla wygody innych dodano „std ::” dla „cout” i „endl”.
Manohar Reddy Poreddy

3

Miałem podobny problem w konkursie kodowania i tak sobie z tym poradziłem. Ustawienie dokładności 2 dla wszystkich podwójnych wartości

Najpierw dodaj nagłówek, aby użyć setprecision

#include <iomanip>

Następnie dodaj następujący kod w naszym pliku main

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

Wynik:

5.99
5.00

Musisz użyć ustalonej wartości 5,00, dlatego wynik nie przyjdzie za 5,00.

Krótki link do filmu, który dodam, jest pomocny


2

Musisz ustawić `` tryb pływający '' na naprawiony.

float num = 15.839;

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

2

Aby ustawić stałe 2 cyfry po przecinku, użyj najpierw tych:

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

Następnie wydrukuj podwójne wartości.

To jest przykład:

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

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

{

 double d=15.6464545347;

printf("%0.2lf",d);

}

0

z szablonami

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

podobne również dla naukowych, z opcją szerokości również (przydatne w przypadku kolumn)

// 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

Tylko drobna uwaga; umieść następujący tekst w nagłówku

using namespace std;

następnie

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

staje się uproszczona do

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


2
Tak, staje się to „uproszczone”, ale jest to zdecydowanie odradzane. Proszę nie używać using namespace std;ze względu na to - zrozum, dlaczego to robisz.
Carlos F

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.