Друк правильної кількості десяткових знаків за допомогою 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Схоже, це не допомагає.)

Відповіді:


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: fix" у програмі?
Vilas Joshi

1
Для цього можна визначити корисний заголовок: #define FIXED_FLOAT(x) std::fixed <<std::setprecision(2)<<(x) це спрощує використання до:cout<<FIXED_FLOAT(d)
Udayraj Deshmukh

13
@VilasJoshi, setprecicision встановити кількість цифр після десяткової, якщо є 5 цифр, і ми використовуємо setprecision (2), ми отримаємо 2 цифри, але якщо є 0 цифр, вона не відображатиме жодної, використовуючи фіксовану, ми фіксуємо стільки цифр буде показано, тому 5 буде представлено як 5.00 ні 5
vaibnak

43

Ви майже були там, вам також потрібно використовувати std :: fix, див. 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

18

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


12

Спростіть прийняту відповідь

Спрощений приклад:

#include <iostream>
#include <iomanip>

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

І ви отримаєте вихід

122.34

Довідка:


Це працювало для мене: std :: cout << std :: setprecision (2) << std :: fix << 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, чи десь ще.
Манохар Редді Поредді

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


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

-3

Просто незначна точка; помістіть у заголовку наступне

використання простору імен std;

тоді

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

стає спрощеним до

cout << фіксований << задана точність (2) << d;


2
Так, це стає "спрощеним", але це сильно не рекомендується. Будь ласка, не використовуйтеusing namespace std; заради цього - зрозумійте, чому ви так робите.
Карлос Ф

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.