为什么“ if else语句”不能正常工作?

时间:2020-06-05 18:19:23

标签: javascript

我正在freecodecamp中进行JS算法和数据结构项目,我陷入了最后一个问题“收银机”。我已经做过一些编码,而我的代码没有通过所有测试。

问题的链接:https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/cash-register

我的代码未通过3和5数字测试。在数字3中,输出几乎相同,但是最后一部分[“ PENNY”,0.03]与输出不匹配。在数字5中,totalCidcashback变量相等,但不返回“ CLOSED”。如果相等,则应返回状态“ CLOSED”。

function checkCashRegister(price, cash, cid) {
  var cashback = (cash - price)
  var returnMoney = {
    status: "",
    change: []
  }
  var totalCid = cid.map(v => {
      return v[1]
    })
    .reduce((a, b) => {
      return a + b
    })
    .toFixed(2)
  console.log(cashback)
  console.log(totalCid)
  if (totalCid === cashback) {
    returnMoney.status = "CLOSED"
    returnMoney.change = cid
    return returnMoney
  } else if (totalCid < cashback) {
    returnMoney.status = "INSUFFICIENT_FUND"
    returnMoney.change = []
    return returnMoney
  } else {
    var denomValue = [{
        bill: "ONE HUNDRED",
        val: 100
      },
      {
        bill: "TWENTY",
        val: 20
      },
      {
        bill: "TEN",
        val: 10
      },
      {
        bill: "FIVE",
        val: 5
      },
      {
        bill: "ONE",
        val: 1
      },
      {
        bill: "QUARTER",
        val: 0.25
      },
      {
        bill: "DIME",
        val: 0.10
      },
      {
        bill: "NICKEL",
        val: 0.05
      },
      {
        bill: "PENNY",
        val: 0.01
      }
    ]
    var newCidArray = [];
    var currVal = 0;
    for (let i = 0; i < denomValue.length; i++) {
      while (cashback >= denomValue[i].val && currVal < cid[8 - i][1]) {
        cashback -= denomValue[i].val.toFixed(2);
        currVal += denomValue[i].val;
      }

      if (currVal > 0) {
        newCidArray.push([denomValue[i].bill, currVal]);
      }
      currVal = 0; // reset current value (currVal) to zero after the loop has completed
    }
    returnMoney.status = "OPEN"
    returnMoney.change = newCidArray
    return returnMoney

  }

}
console.log(checkCashRegister(19.5, 20, [
  ["PENNY", 0.5],
  ["NICKEL", 0],
  ["DIME", 0],
  ["QUARTER", 0],
  ["ONE", 0],
  ["FIVE", 0],
  ["TEN", 0],
  ["TWENTY", 0],
  ["ONE HUNDRED", 0]
]))

1 个答案:

答案 0 :(得分:0)

您的代码中总共有3个问题。

第一个由@trincot指出:Thread返回一个字符串,您不能将其与toFixed()比较为数字。

第二个原因是,即使抽屉中的现金超过预期的零钱,您仍处于===状态,因为您无法拆分所拥有的钞票(纸币,英式英语)和硬币。这意味着在算法结束时,您必须检查更改是否汇总。

第三个也是主要的一个来自于使用浮点数。如果单击“在代码下运行代码段”,您会看到零钱为INSUFFICIENT_FUNDS美元。

摆脱浮点沼泽的唯一安全方法是将所有内容都转换为整数。因此,除了解决前两个问题外,我所做的就是在脚本中将美元转换为几美分。尽管如此,我还是尽量不要改变您的脚本。

0.49000000000000027

关于为什么需要这些function checkCashRegister(price, cash, cid) { // P stands for pennies var cidP = cid.map(v => [v[0], Math.round(v[1] * 100)]) var priceP = Math.round(price * 100) var cashP = Math.round(cash * 100) var cashbackP = (cashP - priceP) var returnMoney = { status: "", change: [] } var totalCidP = cidP.map(v => { return v[1] }) .reduce((a, b) => { return a + b }) if (totalCidP === cashbackP) { returnMoney.status = "CLOSED" returnMoney.change = cid return returnMoney } else if (totalCidP < cashbackP) { returnMoney.status = "INSUFFICIENT_FUNDS" returnMoney.change = [] return returnMoney } else { var denomValueP = [ {bill: "ONE HUNDRED", val: 10000}, {bill: "TWENTY", val: 2000}, {bill: "TEN", val: 1000}, {bill: "FIVE", val: 500}, {bill: "ONE", val: 100}, {bill: "QUARTER", val: 25}, {bill: "DIME", val: 10}, {bill: "NICKEL", val: 5}, {bill: "PENNY", val: 1} ] var changeArray = []; for (let i = 0; i < denomValueP.length; i++) { var currValP = 0; while (cashbackP >= denomValueP[i].val && currValP < cidP[8 - i][1]) { cashbackP -= denomValueP[i].val; currValP += denomValueP[i].val; } if (currValP > 0) { changeArray.push([denomValueP[i].bill, currValP / 100]); } } if (cashbackP === 0) { returnMoney.status = "OPEN" returnMoney.change = changeArray } else { returnMoney.status = "INSUFFICIENT_FUNDS" returnMoney.change = [] } return returnMoney } } 的原因,请尝试以下操作:

Math.round()

编辑

您要求对代码中的最后一个if-else进行澄清。 freecodecamp中的第四段说:

如果提取现金,则返回4567.89 * 100 === 456789 // => false 小于应缴的更改额,或者如果您无法返回准确的 更改

如果您已结束算法,并且{status: "INSUFFICIENT_FUNDS", change: []}(您为添加到零钱中的每张钞票或硬币所减少的金额)未趋于零,则表明零钱尚未完成,而您处于我强调的情况。