【发布时间】:2018-11-30 04:38:42
【问题描述】:
我为 freecodecamp 构建的收银机功能设置了以下代码。我注意到浮点数的几个问题,所以每次对浮点数进行计算时,我都会听取其他人的建议并添加 .toFixed(2) 。我目前遇到的两个问题是:
- 我正在创建 cid 的副本,这样我就不会对其进行修改,并且可以在抽屉解析为关闭时将其返回,但是 cid 会与 cidCopy 一起被修改,即使我对其进行了切片并且从未修改过它李>
- 我无法使用Fixed(2) 处理的一个号码是
changeObj.change[j][1] += value[x[0]];。如果我将其更改为changeObj.change[j][1] = (changeObj.change[j][1] + value[x[0]]).toFixed(2);我会收到错误(changeObj.change[j][1] + value[x[0]]).toFixed is not a function这会将很多数字变成疯狂的浮点数,但如果我能得到 1. 解决,我实际上可以通过测试,我只想知道它为什么会这样那个。
这是我的代码:
function checkCashRegister(price, cash, cid) {
var cidCopy = cid.slice(0);
cidCopy.reverse();
const value = {
"PENNY": 0.01,
"NICKEL": 0.05,
"DIME": 0.10,
"QUARTER": 0.25,
"ONE": 1.00,
"FIVE": 5.00,
"TEN": 10.00,
"TWENTY": 20.00,
"ONE HUNDRED": 100.00
};
var rawChange = cash - price;
var remaining = rawChange;
var changeObj = {
status: '',
change: []
};
var j = 0;
cidCopy.forEach(x => {
if(value[x[0]] < rawChange && remaining > 0 && remaining > value[x[0]]) {
changeObj.change.push([x[0], 0])
changeObj.status = "OPEN";
while (remaining - value[x[0]] >= 0 && x[1] - value[x[0]] >= 0) {
x[1] = (x[1] - value[x[0]]).toFixed(2);
remaining = (remaining - value[x[0]]).toFixed(2);
changeObj.change[j][1] += value[x[0]];
}
j += 1;
}
});
if (remaining > 0.01) {
changeObj.status = 'INSUFFICIENT_FUNDS';
changeObj.change = [];
} else if (cidCopy.every(x => {return x[1] < .01;})) {
changeObj.status = 'CLOSED';
changeObj.change = cid;
}
console.log(changeObj);
return changeObj;
}
checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]);
【问题讨论】:
-
toFixed是一个数字的方法,并产生一个字符串 - 所以,也许changeObj.change[j][1] + value[x[0]]是一个字符串? -
不是字符串。我测试了
console.log(typeof (changeObj.change[j][1] + value[x[0]]));,它解析为“数字”。 -
我建议从所有计算中消除浮点数。用美分整数做所有事情。仅在需要显示(或解析)值时转换为美元和美分。
-
好吧,
changeObj.change[j][1]是第一次通过循环的数字,但第二次它必须是一个字符串,因为.toFixed产生一个字符串 - 您可以通过以下方式“修复”该问题changeObj.change[j][1] = (+changeObj.change[j][1] + value[x[0]]).toFixed(2);- 注意第一个(一元)+ -
就您的“cid”复制问题而言,那是因为您传入了一个数组数组,cidcopy 与 cid 不同,但是,每个元素都指的是同一个数组,即@ 987654333@ 等 ... 另一个快速而肮脏的修复 -
var cidCopy = JSON.parse(JSON.stringify(cid))- 所以,总的来说,jsfiddle.net/k7qjmhfu 修复了这两个问题
标签: javascript arrays object ecmascript-6 floating-point