Есть ли способ форматировать вывод более конкретно в C ++? - PullRequest
1 голос
/ 05 апреля 2020

Когда я присваиваю значение в setprecision() для 1

и

{ 1, 1, 1, 2, 1, 1, 1, 4, 1, 0, 1, 1 }

вводится как значения, MyProgrammingLab говорит, что у меня ошибка в выход для average. Моя программа отображает 1.2, когда она должна отображать 1.25.

Поэтому, когда я изменяю значение в setprecision() на 2

и

{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }

вводится как значения, MyProgrammingLab снова говорит У меня ошибка в выводе average. Моя программа отображает 6.50, когда должна отображаться только 6.5.

Что я могу сделать, чтобы average выводился правильно в обоих случаях?

#include <iostream>
#include <iomanip>

using namespace std;

int main() {

   // Creating int variable to hold total 
   double total = 0;

   // Array
   double value[12];

   // Loop to prompt user for each value
   for (int i = 0; i < 12; i++) {
      cout << "Enter value: ";  
      cin >> value[i];
    }

   // Loop to add all values together
   for (int i = 0; i < 12; i++)
       total += value[i];

   // Creating a double to hold average
   double average;

   // Formatting output
   cout << fixed << showpoint << setprecision(2);

   // Calculating average
   average = total / 12;

   // Displaying average
   cout << "Average value: " << average << endl;

   return 0;

}

1 Ответ

2 голосов
/ 05 апреля 2020

Вы можете написать небольшую вспомогательную функцию, которая форматирует строку так, как вы хотите. Я добавил комментарии в свой код для объяснения.

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>

std::string RemoveTrailingZero(double value)
{
    //Convert to precision of two digits after decimal point
    std::ostringstream out;
    out << std::fixed << std::setprecision(2) << value;
    std::string str = out.str();

    //Remove trailing '0'
    str.erase(str.find_last_not_of('0') + 1, std::string::npos);

    //Remove '.' if no digits after it
    if (str.find('.') == str.size() - 1)
    {
        str.pop_back();
    }
    return str;
}

int main()
{
    std::cout << RemoveTrailingZero(1.25) << std::endl;
    std::cout << RemoveTrailingZero(6.50) << std::endl;
    std::cout << RemoveTrailingZero(600.0) << std::endl;
}

Вывод:

1.25
6.5
600
...