Ответ округляется, когда не должно быть переполнения стека

#include <iostream>
#include <cmath>
#include <iomanip>
#include <string>
using namespace std;

int main()
{
//Declaration of Variables
float TotalCollected; // Total Amount Collected from sales
double sales; // Sale excluding tax
float CountyTaxRate; // Tax rate for County
float StatesTaxRate; // Tax rate for state

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

//We get data from the user
cout << "What is the Total Collected Amount? ";
cin >> TotalCollected;
cout << "What is the County Tax rate? ";
cin >> CountyTaxRate;
cout << "What is the State Tax rate ";
cin >> StatesTaxRate;

//Calculations
sales = TotalCollected / (1 + StatesTaxRate + CountyTaxRate);

//Output
cout << "Sales: $" << sales << endl;
return 0;
}

Ставка налога округа = .02 ставка налога штата = .04
общая собранная сумма = 26572,89

Выход должен быть 25068,76, но я продолжаю получать 25068,77.

0

Решение

Если честно, проблема, с которой вы столкнулись, заключается в том, что вы используете тип float, и не double, Это, по сути, делает ваши десятичные значения менее точными.

Если я установлю точность на 3 без изменения типа данных, то получу число: 25068,765. Однако, если я изменю тип данных на double и держу точность на 3, тогда я получу число 25068.764.

Теперь, учитывая 2 значения с плавающей точкой, мы ожидаем, что прецизионное значение хранится в переменной типа double быть правильным номером.

Поэтому вы должны установить тип данных ваших переменных в double, а также НЕ float, Это должно решить проблему под рукой.

Надеюсь это поможет.

1

Другие решения

Вероятно, редко бывает хорошей идеей использовать числа с плавающей точкой для арифметики высокой точности и 32-разрядных float особенно плохо. Его точность составляет всего 24 бита, что примерно равно 6-7 десятичным цифрам. Также, если вы выполняете определенные арифметические операции (например, деление) над числами с плавающей запятой, результат будет еще менее точным.

Так что если вы хотите, чтобы все было просто, используйте double, Точность составляет около 53 бит, что может представлять примерно от 16 до 17 десятичных цифр.

Или немного лучше использовать целочисленные типы, такие как long long и относиться к нему как центы. Целочисленная арифметика гораздо более точна и предсказуема.

Наконец, вы всегда можете использовать высокоточную библиотеку, хотя я думаю, double или же long long будет достаточно для вас.

1

По вопросам рекламы [email protected]