Как подсчитать сумму прогрессивного налога?
Создай функцию, которая рассчитывает сумму налогов исходя из объема доходов income. Используй 3-х ступенчатую модель налогообложения:
часть income до 1000 облагается налогом 2%
часть income от 1000 до 10000 - 3%
всё что больше 10000 - 5%
Криво косо я уже решил первые 2 ступеньки, а вот в третьем условии ничего не происходит
function calculateTaxes(income) {
if (income <= 1000) {
return income * 0.02;
}
if (income > 1000) {
return ((1000 * 0.02) + (income - 1000) * 0.03);
}
if(income > 10000) {
return income * 100000;
}
}
Ответы (6 шт):
У вас второй if выполняется всегда, когда income > 1000. Т.е и тогда когда income = 1000000. Задайте более жесткое условие income > 1000 && income <= 10000. Или поменяйте 2й и 3й местами
Потому что второй if (и выход из функции) наступает раньше чем третий при значении income больше 10000:
function calculateTaxes(income) {
if (income <= 1000 ) {
return ...
} else if (income > 10000) {
return ...
} else if (income > 1000) {
return ...
}
}
или
function calculateTaxes(income) {
if (income <= 1000 ) {
return ...
} else if (income > 1000) {
if (income > 10000) {
return ...
}
return ...;
}
}
Если я правильно понял задачу, то от введенной суммы нужно сначала взять 5%, пока сумма больше 10к, потом 3% пока сумма больше 1к и потом уже 2%. А не просто сделать проверку и если больше 10к, то такой процент, если больше 1к, то другой и тд
const calculateTaxes = income => {
tax = 0;
if (income >= 10000) {
tax = Math.floor(income / 10000) * 10000 * 0.05;
income = income % 10000;
}
if (income >= 1000) {
tax = Math.floor(income / 1000) * 1000 * 0.03 + tax;
income = income % 1000;
}
tax = income * 0.02 + tax;
return tax;
}
С начала у меня била проблема с тем, что я росбирал проценты от всей суммы (income),
a нужно от каждой части брать свой процент
'use strict'
function calculateTaxes(income) {
if (income <= 1000) {
return income * 0.02;
}
if (income > 1000 && income <= 10000) {
return 1000 * 0.02 + (income - 1000) * 0.03;
}
if (income > 10000) {
return 1000 * 0.02 + 9000 * 0.03 + (income - 10000) * 0.05;
}
}
function calculateTaxes(income) {
if (income <= 1000 ) {
return income*0.02;
} else if (income <= 10000) {
return income*0.03;
} else if (income > 10000) {
return income *0.05;
}
}
Уже ответили что второй условный оператор не даёт исполниться третьему. Налог по таблице удобно считать с больших сумм к меньшим. Сумма дохода разбивается на части и сумма налога накапливается по частям:
const calculateTax = income => {
let tax = 0;
if (income > 10000) {
tax += 5 / 100 * (income - 10000); // 5% за доход больший 10000
income = 10000;
}
if (income > 1000) {
tax += 3 / 100 * (income - 1000); // 3% за доход больший 1000
income = 1000;
}
tax += 2 / 100 * income; // 2% за оставшийся доход
return tax;
};
В коде выше суммы порогов упоминаются многократно. Сам код "табличный" - можно переписать его в виде цикла:
const calculateTax = income => {
// таблица налоговых ставок записывается по убыванию порогов
const rates = [
[10000, 5], // всё что больше 10000 - 5%
[ 1000, 3], // часть дохода от 1000 до 10000 - 3%
[ 0, 2] // часть дохода до 1000 облагается налогом 2%
];
let tax = 0;
for (const [threshold, rate] of rates) {
if (income > threshold) {
tax += rate / 100 * (income - threshold);
income = threshold;
}
}
return tax;
};
Здесь уже дублирования кода и констант нет - меньше возможности совершить ошибку. Не очевидное требование к таблице налоговых ставок - она должна быть записана от больших порогов к меньшим.