Как вернуть целые числа из массива, которые объединяют значения? - PullRequest
0 голосов
/ 25 сентября 2019

Мне было дано простое задание создать калькулятор чаевых следующим образом:

Джон и его семья отправились на каникулы и пошли в 3 разных ресторана.Счета составляли 124, 48 и 268 долларов.

Чтобы дать официанту значительную сумму, Джон создал простой калькулятор чаевых (как функция).Ему нравится давать чаевые 20% от суммы счета, если сумма счета составляет менее 50 долларов США, 15% - от 50 до 200 долларов США и 10% - от 200 долларов.

В конце концов, Джонхотел бы иметь 2 массива:

1) Содержит все три подсказки (по одному на каждый счет) 2) Содержит все три окончательные оплаченные суммы (счет + чаевые).

** Проблема, котораяЯ имею в виду, что мой массив finalAmounts возвращает объединенные значения вместо желаемой суммы подсказок billAmounts +, что приводит к следующему: **

Общая выплаченная сумма: 12418.6, 489.60, 26826.80

Мои желаемые результаты, конечно, будут: 142,6, 47,60 и 294,80

Вот мой код:

var billAmounts = [
    124,
    48,
    268
];

function tipCaluclator(bill) {
    if (bill < 50) {
        percentage = (20/100);
    } else if (bill >= 50 && bill < 200) {
        percentage = (15/100);
    } else { 
        percentage = (10/100);
    }
    var tip = percentage * bill;
    //return tip amount to 2 decimal places
    return tip.toFixed(2);
};=

var tips = [
    tipCaluclator(billAmounts[0]),
    tipCaluclator(billAmounts[1]),
    tipCaluclator(billAmounts[2])
];
console.log('These are the tip amounts: ', tips)

var finalAmounts = [
    billAmounts[0] + tips[0],
    billAmounts[1] + tips[1],
    billAmounts[2] + tips[2]
];
console.log('These are the full amounts: ', finalAmounts);

Ответы [ 3 ]

0 голосов
/ 26 сентября 2019

Числа, вставленные в массив в виде строк, и это нормально, если это то, что вы хотите, но вы должны сделать две вещи: 1. с parseFloat вам нужно сначала преобразовать его в десятичные дроби - чтобы строки не былиКонкат вместо суммы вместе.2. После этого вы можете использовать метод map для каждого числа, полученного вами, для метода toFixed (2), чтобы получить 142.60, а не 142.6 (для каждого из чисел).после этого он вернется к массиву в виде строк, таких как массив tips

Надеюсь, что это помогает (:

var billAmounts = [
    124,
    48,
    268
];

function tipCaluclator(bill) {
    if (bill < 50) {
        percentage = (20/100);
    } else if (bill >= 50 && bill < 200) {
        percentage = (15/100);
    } else { 
        percentage = (10/100);
    }
    var tip = percentage * bill;
    //return tip amount to 2 decimal places
    return tip.toFixed(2);
};

var tips = [
    tipCaluclator(billAmounts[0]),
    tipCaluclator(billAmounts[1]),
    tipCaluclator(billAmounts[2])
];
console.log('These are the tip amounts: ', tips)

var finalAmounts = [
    parseFloat(billAmounts[0]) + parseFloat(tips[0]),
    parseFloat(billAmounts[1]) + parseFloat(tips[1]),
    parseFloat(billAmounts[2]) + parseFloat(tips[2])
];

finalAmounts = finalAmounts.map(function(elem){
	return parseFloat(elem).toFixed(2)
})

console.log('These are the full amounts: ', finalAmounts);
0 голосов
/ 26 сентября 2019

Два основных совета:

  1. Удалите ;= после функции tipCaluclator.
  2. Избегайте вызовов .toFixed(2), пока не перейдете к выводу значений.Они фактически становятся строками - они больше не являются числами, которые можно использовать в других ваших расчетах.С некоторыми другими, более незначительными обновлениями кода, вот пример рабочего кода (насколько я понимаю вашу задачу, по крайней мере):

const billAmounts = [
  124,
  48,
  268,
]

const numbersToCurrencyStrings = nums => nums.map(num => `$${num.toFixed(2)}`)

const tipCalculator = (bill) => {
  if (bill < 50) {
    return bill * .2
  } else if (bill >= 50 && bill < 200) {
    return bill * .15
  }
  return bill * .1
}

// Calculate tips
const tips = billAmounts.map(tipCalculator)
console.log('These are the tip amounts: ', numbersToCurrencyStrings(tips))

// Add matching tips to bills
const finalAmounts = billAmounts.map((bill, idx) => bill + tips[idx])
console.log('These are the full amounts: ', numbersToCurrencyStrings(finalAmounts))
0 голосов
/ 26 сентября 2019

Ваш return tip.toFixed(2); меняет число на строку, поэтому значения объединяются.

Вы можете просто сначала вычислить суммы, а затем, когда вы отобразите суммы, затем преобразовать их в два десятичных знака.Или вы можете использовать parseFloat() после использования toFixed(2);

...