function checkCashRegister(price, cash, cid) {
let amount = {
"ONE HUNDRED": 100,
"TWENTY": 20,
"TEN": 10,
"FIVE": 5,
"ONE": 1,
"QUARTER": 0.25,
"DIME": 0.1,
"NICKEL": 0.05,
"PENNY": 0.01
}
let copy = cid.slice();
let sum = cid.map(el => (el[1])).reduce((a, b) => (a + b));
let changeDue = cash - price;
let newArr = [];
let result = {};
if (sum === changeDue) {
result.status = 'CLOSED';
result.change = copy;
}
for (let i = cid.length - 1; i >= 0; i--) {
let count = 0;
let unit = amount[cid[i][0]];
while (unit <= changeDue && unit <= cid[i][1]) {
changeDue -= unit;
cid[i][1] -= unit;
count++;
}
newArr.push([cid[i][0], count * unit]);
}
return result;
}
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]
]));
您好,我正在尝试解决一个问题,我应该打印状态和金额的变化。我正在处理过程中,我有一个与方法相关的问题。
因为如果现金收款机的金额等于现金减去价格,我应该打印"status: close“和货币,所以我用slice()方法复制了"cid”数组(这是输入),这样它就不会影响我要在其他条件下使用的"cid“,我用它来计算找零的金额。
因此,为了检查closed状态是否正常工作,我打印了它,我预计PENNY是0.5,但由于某种原因,它受到了下面的if -statement(用于循环部分)的代码的影响,PENNY部分是0.000XXX。因此,当我试图将return语句移到if语句的正下方时。它像我预期的那样工作。
我的问题是,我预计for循环既不会影响也不会受到影响,因为slice()方法不会改变原始的arry(cid),但它并没有像我预期的那样工作。
有人能找出原因吗?
发布于 2019-12-01 21:31:03
你的代码的问题是,它减去了几分钱作为小数值,所以当你用几分钱做算术时,你可能会得到非四舍五入的便士,我的意思是你可以得到0.0799999,而不是0.08,等等。这是因为0.01只是内部表示的近似。这不是整数值的情况,整数值总是精确地表示。因此,我要做的第一件事就是用便士数而不是美元数来处理分数(1便士是1,1美元是100,100美元是10000,依此类推)
考虑下面的例子:
console.log(100 - (0.01 + 0.01)) // 99.98
console.log(100 - 0.01 - 0.01) // 99.97999999999999至于为什么结果会受到影响的主要问题--这是因为尽管您确实通过
let copy = cid.slice();然而,新的数组具有相同的元素。我的意思是copy1和cid1都指向同一个JS对象,恰好是'PENNY',0.5。这实际上是绝对意义上的同一物体。
看,你没有做“深度复制”,你只做了“浅”复制。您复制了容器,但内部元素是相同的,它们链接到相同的内容。就像这样。
https://stackoverflow.com/questions/59125781
复制相似问题