Как подсчитать сумму прогрессивного налога?

Создай функцию, которая рассчитывает сумму налогов исходя из объема доходов 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 шт):

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

У вас второй if выполняется всегда, когда income > 1000. Т.е и тогда когда income = 1000000. Задайте более жесткое условие income > 1000 && income <= 10000. Или поменяйте 2й и 3й местами

→ Ссылка
Автор решения: Alexander Chernin

Потому что второй 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 ...;
  }
}
→ Ссылка
Автор решения: Gelloiss

Если я правильно понял задачу, то от введенной суммы нужно сначала взять 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;
}
→ Ссылка
Автор решения: Yuriy Chabarenko
С начала у меня била проблема с тем, что я росбирал проценты от всей суммы (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;
  }
}
→ Ссылка
Автор решения: Mykola Oleksiv
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;
  }
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

Уже ответили что второй условный оператор не даёт исполниться третьему. Налог по таблице удобно считать с больших сумм к меньшим. Сумма дохода разбивается на части и сумма налога накапливается по частям:

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

Здесь уже дублирования кода и констант нет - меньше возможности совершить ошибку. Не очевидное требование к таблице налоговых ставок - она должна быть записана от больших порогов к меньшим.

→ Ссылка