Приложение, которое вычисляет цену в зависимости от количества в JavaScript

#javascript

#javascript

Вопрос:

У меня есть это упражнение, в котором я изо всех сил пытаюсь понять логику для достижения результата, когда qty больше 3:

Приложение для расчета цены пиццы (перечисленных ниже), которые будут приобретены в течение рекламного периода. Количество пицц будет введено пользователем.

  • Одна большая пицца будет стоить $ 6,45.
  • Две большие пиццы будут стоить 12,00 долларов.
  • Три большие пиццы будут стоить 14,00 долларов.
  • Четыре или более пиццы будут использовать комбинацию вышеуказанных цен, чтобы обеспечить лучшую цену для клиента. Например, лучшая цена за пять пицц будет две пиццы ($ 12,00) три пиццы ($ 14,00).

Алгоритм также должен учитывать все возможные ситуации, используя структуры последовательности, выбора и итерации.

Ниже приведен мой код на данный момент:

 let calcOrder = () => {
  // get inputs

  var qty = document.getElementById("quantity").value;
  var price = 6.45;
  var price2 = 12.0;
  var price3 = 14.0;
  var totalPrice;

  // validate missing, non-digit, negative inputs

  if (qty == "") {
    document.getElementById("message").innerHTML = "Missing input";
  } else if (isNaN(qty)) {
    document.getElementById("message").innerHTML = "Numbers only";
  } else if (qty < 0) {
    document.getElementById("message").innerHTML =
      "Negative numbers are not allowed";
  } else {
    //calc total
    if (qty == 1) 
    {
      totalPrice = price;
    }
    else if (qty == 2)
    {
      totalPrice = price2;
    }
    else if (qty == 3)
    {
      totalPrice = price3;
    }
    //output total

    document.getElementById("message").innerHTML =
      `Total price is $${totalPrice}`;
  }

  // prevent form from submission
  return false;
};
  

Спасибо

Ответ №1:

вы можете использовать операции деления и модуляции для расчета цены:

(в этом примере предполагается, что все проверки правильности ввода уже выполнены)

 const qte = document.getElementById("quantity").value;
const price = 6.45;
  const price2 = 12.0;
  const price3 = 14.0;
  let totalPrice;

const total3 = parseInt(""   qte / 3   "", 10) * price3;
const total2 = parseInt(""   (qte % 3) / 2   "", 10) * price2;
const total1 = parseInt(""   ((qte % 3) % 2)   "", 10) * price;

totalPrice = total1   total2   total3;

document.getElementById("message").innerHTML =
      `Total price is $${totalPrice}`;
  

что на самом деле происходит в коде

ну, это базовая математика, если вы хотите знать, сколько 3 в вашем числе вы делите на 3 и берете целую часть или пол результата, базовое деление. например, 10 = 3*3 1 итак, в результате этого деления у вас есть 3. поскольку вы хотите использовать цену только за 3 пиццы в качестве высшего приоритета, вы делаете это деление, а затем умножаете на цену за 3.

затем приходит приоритет для цены 2 пиццы, но вас не интересует общее количество пицц, только то, что осталось после того, как вы заплатили по цене 3 пиццы, поэтому вы выполняете оператор mod (%) с 3, чтобы получить, осталось неоплаченным, например 8 = 3 * 2 2, это дает нам 2 пиццы, оставшиеся неоплаченными, поэтому вы применяете цену за 2 пиццы.

вы проверяете, осталась ли одна пицца после того, как вы заплатили за 2 пиццы (что произойдет, только если после оплаты за 3 осталась только одна пицца). если есть одна пицца, вы платите за нее, иначе вы ничего не добавляете.

ps: после оплаты пиццы, кратной трем, вы добавляете цену только за 2 пиццы или одну, но никогда за обе, иначе вместо этого будет применяться цена за 3 пиццы.

надеюсь, объяснение понятно, если нет, оставьте комментарий, и я постараюсь исправить то, что было непонятно.

Комментарии:

1. Почему "" в начале и в конце каждого вычисления есть итоговый расчет? parseInt(qte / 3, 10) будет работать нормально. Или, может быть, более описательно Math.floor(qte / 3) .

2. Math.floor тоже может работать, но parseInt требует строку в качестве параметра.

3. @chawkichalladia Если вы передаете не строку toString() , вызывается аргумент. parseInt({toString: () => "42"}, 10) //=> 42