C++ | Проблема с выводом double, не выводится дробная часть

Я вывожу значение money_earned, которое высчитывается в функции calculate_salary_with_dependences(), но оно выводится без дробной части. Везде в функции используется double. Сомнения вызывали строки типа: salary.september = (salary.september / TOTAL_WORK_DAYS_SEPTEMBER) * A[0]; Но salary.september является double и последующие операции тоже должны выдать double. Кастовал A[i] к double, тоже нет результата. В cout << ... << money_earned тоже кастовал эту переменную к double и явно и статически, но прогресса не дало.

В чем может быть причина проблемы? Почему double выводится как int?

Вот вывод консоли: введите сюда описание изображения

#include <iostream>
#include <Windows.h>
using namespace std;

// Макрос для "русификации" консоли. Изменяет кодировку выводимых символов
#define CONSOLE_RU { \
    SetConsoleCP(1251); \
    SetConsoleOutputCP(1251); \
}

const double INCOME_TAX = 0.13; // Подоходный налог

// Коэффициенты премии
const double AWARD_FOR_SEPTEMBER = 0.1; 
const double AWARD_FOR_OCTOBER = 0.15;
const double AWARD_FOR_NOVEMBER = 0.2;

// Количество рабочих дней
const int TOTAL_WORK_DAYS_SEPTEMBER = 21;
const int TOTAL_WORK_DAYS_OCTOBER = 23;
const int TOTAL_WORK_DAYS_NOVEMBER = 21;

// Количество рабочих
const int COUNT_EMPLOYEE = 10;

// Класс Работник
class Employee {
public:
    // Структура, содержащая оклад работника за конкретный месяц
    struct Salary {
        double september; // За сентябрь
        double october; // За октябрь
        double november; // За ноябрь
    };

private:
    string full_name{ "" }; // ФИО

    string job_role{ "" }; // Должность

    Salary salary{ 0., 0., 0. };

    double money_earned = 0.; // "К выдаче", то есть зарплата с учетом всех зависимостей

public:
    Employee() = default; // Обычный конструктор 
    ~Employee() = default; // Обычный деструктор

    // Функция, заменяющая конструктор, нужна для заполнения полей объекта класса.
    void fill_data(string full_name, string job_role, Salary salary) {
        this->full_name = full_name;
        this->job_role = job_role;
        this->salary = salary;
    }

    // Функция, вычисляющая значение "К Выдаче", то есть оклад с учетом отработанных дней и премией
    void calculate_salary_with_dependences(int* A) {
        salary.september = (salary.september / TOTAL_WORK_DAYS_SEPTEMBER) * A[0]; // Оклад за сентябрь по формуле
        salary.october = (salary.october / TOTAL_WORK_DAYS_OCTOBER) * A[1]; // Оклад за октябрь по формуле
        salary.november = (salary.november / TOTAL_WORK_DAYS_NOVEMBER) * A[2]; // Оклад за ноябрь по формуле

        double accrued = salary.september + salary.october + salary.november; // Начислено

        double award = 0.; // Сумма премий за каждый месяц
        award += salary.september * AWARD_FOR_SEPTEMBER;
        award += salary.october * AWARD_FOR_OCTOBER;
        award += salary.november * AWARD_FOR_NOVEMBER;

        double tax = (accrued) * INCOME_TAX; // Подоходный налог

        money_earned = accrued + award - tax;
    }

    void print_data(char end) {
        cout << full_name << " " << job_role << " " << money_earned << end;
    }
};

// Функция, создающая всех работников согласно ведомости 
Employee* create_employees() {
    Employee* employees = new Employee[COUNT_EMPLOYEE]();

    employees[0].fill_data("Комаров С.П.", "Директор", Employee::Salary{ 150000., 160000., 170000. });
    employees[1].fill_data("Топоркова М.С.", "Гл. бухгалтер", Employee::Salary{ 110000., 117000., 123000. });
    employees[2].fill_data("Сычук А.Д.", "Бухглалтер", Employee::Salary{ 80000., 85000., 92000. });
    employees[3].fill_data("Морозова К.Л.", "Секретарь", Employee::Salary{ 55000., 58000., 61000. });
    employees[4].fill_data("Антипов В.Н.", "Менеджер", Employee::Salary{ 70000., 74000., 78000. });
    employees[5].fill_data("Ничушкина О.Л.", "Продавец", Employee::Salary{ 45000., 47000., 47000. });
    employees[6].fill_data("Коростылев М.И.", "Продавец", Employee::Salary{ 45000., 47000., 47000. });
    employees[7].fill_data("Воропаева Е.В.", "Кассир", Employee::Salary{ 80000., 85000., 92000. });
    employees[8].fill_data("Булгарин Р.И.", "Водитель", Employee::Salary{ 40000., 42000., 44000. });
    employees[9].fill_data("Федосеев С.Т.", "Сторож", Employee::Salary{ 35000., 36000., 37000. });

    return employees;
}

int main() {
    CONSOLE_RU
    Employee* employees = create_employees();

    // Количество фактически отработнных дней (не константа, т.к. в обычной жизни вполне изменяемое значение)
    int* A = new int[3]{ 21, 22, 20 }; 

    for (int i = 0; i < COUNT_EMPLOYEE; i++) {
        employees[i].calculate_salary_with_dependences(A);
        employees[i].print_data('\n');
    }

    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Попробуйте

<< fixed << setprecision(2) << money_earned
→ Ссылка