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