Печать правильного количества десятичных знаков с помощью cout

133

У меня есть список floatзначений, и я хочу напечатать их coutс двумя десятичными знаками.

Например:

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

Как я могу это сделать?

( setprecisionпохоже, не помогает в этом.)

thameera
источник

Ответы:

196

С <iomanip>, вы можете использовать std::fixedиstd::setprecision

Вот пример

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;

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

И вы получите результат

122.34
бедуин
источник
6
почему вы использовали в программе "std: fixed"?
Вилас Джоши
1
Для этого может быть определен полезный заголовок: #define FIXED_FLOAT(x) std::fixed <<std::setprecision(2)<<(x) который упрощает использование:cout<<FIXED_FLOAT(d)
Udayraj Deshmukh
13
@VilasJoshi, setprecision устанавливает количество цифр после десятичной дроби, если есть 5 цифр, и мы используем setprecision (2), мы получим 2 цифры, но если цифр 0, он не покажет ни одного, используя фиксированное, мы исправляем, что у многих цифр есть будет отображаться так, что 5 будет отображаться как 5.00 нет 5
vaibnak
43

Вы были почти у цели, также необходимо использовать std :: fixed, см. 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;
}

выходы:

0.12
1.23
12.35
123.45
1234.50
12345.00
Vusak
источник
18

setprecision(n)применяется ко всему числу, а не к дробной части. Вам нужно использовать формат с фиксированной точкой, чтобы применить его к дробной части:setiosflags(ios::fixed)

QuantumMechanic
источник
12

Упростите принятый ответ

Упрощенный пример:

#include <iostream>
#include <iomanip>

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

И вы получите результат

122.34

Ссылка:

einverne
источник
У меня это сработало: std :: cout << std :: setprecision (2) << std :: fixed << d;
Андреа Жирарди
5

У меня возникла проблема с целыми числами, когда я хотел согласованное форматирование.

Перепишем для полноты:

#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
}
Манохар Редди Поредди
источник
Вам не хватает std :: прямо перед cout и endl, поскольку вы не используете пространство имен.
blackforest-tom
@ blackforest-tom - Может быть, вы правы, не могу вспомнить - я обычно копирую и вставляю рабочие программы, так что это могло работать как есть в Visual Studio или где-то еще.
Manohar Reddy Poreddy
3

У меня была аналогичная проблема на соревновании по кодированию, и я решил ее так. Установка точности 2 для всех двойных значений

Сначала добавляем заголовок для использования setprecision

#include <iomanip>

Затем добавляем следующий код в наш основной

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

Вывод:

5.99
5.00

Вам нужно использовать фиксированный для написания 5.00, поэтому ваш вывод не придет за 5.00.

Я добавляю короткую справочную видео-ссылку, которая полезна

Харгун Сингх
источник
2

Вы должны установить «плавающий режим» на фиксированный.

float num = 15.839;

// this will output 15.84
std::cout << std::fixed << "num = " << std::setprecision(2) << num << std::endl;
Эрик З.
источник
1

Чтобы установить фиксированные 2 цифры после десятичной точки, используйте сначала следующие:

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

Затем распечатайте двойные значения.

Это пример:

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

}
saurav52
источник
0

с шаблонами

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

аналогично и для научных, с опцией ширины (полезно для столбцов)

// 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
источник
-3

Просто мелочь; поместите в заголовок следующее

используя пространство имен std;

затем

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

становится упрощенным до

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

Davidjgw
источник
2
Да, он становится «упрощенным», но это категорически не рекомендуется. Пожалуйста, не используйте using namespace std;ради этого - поймите, почему вы это делаете.
Carlos F
-6

это пример использования матрицы.

cout<<setprecision(4)<<fixed<<m[i][j]
Луис Энрике Мартинес
источник