gpt4 book ai didi

javascript - slice() 方法/Javascript

转载 作者:行者123 更新时间:2023-11-30 13:46:55 27 4
gpt4 key购买 nike

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”和钱,我用 复制了“cid”数组(输入) slice() 方法,这样它就不会影响我将在其他条件下使用它来计算变化量的“cid”。

所以为了检查关闭状态是否正常,我打印了它,我希望 PENNY 为 0.5 但是,由于某种原因,它受到了 if 语句下面的代码(for 循环部分)和 PENNY 部分的影响是 0.000XXX。所以当我试图将 return 语句移到 if 语句的正下方时。它按我的预期工作。

我的问题是我希望 for 循环既不会影响也不会受到影响,因为 slice() 方法不会改变原始的 arry(cid),但它没有像我预期的那样工作。

谁能知道为什么?

最佳答案

您的代码的问题在于它会将便士作为分数值减去,因此当您对便士的数量进行算术运算时,您最终可能会得到非四舍五入的便士,我的意思是您可以获得 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();

然而,新数组具有相同的元素。我的意思是 copy[1] 和 cid[1] 都指向同一个 JS 对象,恰好是 ['PENNY', 0.5]。这在绝对意义上确实是同一个对象。

看,你没有做“深拷贝”,你只做了“浅”拷贝。您复制了容器,但内部元素是相同的,它们链接到完全相同的事物。像这样。

关于javascript - slice() 方法/Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59125781/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com