这个while循环本质上是在考虑抽屉里有什么的情况下,找到要回馈给客户的最佳货币单位,并将其添加到change数组中。
while (difference > 0) {
var unit = Object.keys(currency).reverse().reduce((output,prop)=>{
if (difference >= currency[prop] && cid[prop] >= currency[prop]) {
output.push(prop, currency[prop]);
} else {}
return output;
}, []);
cid[unit[0]] -= unit[1];
difference -= unit[1];
change.push(unit);
}
- cid是抽屉里的现金
- 列出项目
差额为prince减去现金
我显然可以作弊,但最好是一个更好的解决方案。
正如Pointy在评论中提到的那样,JavaScript并不是真正为浮点数学而设计的(实际上,它不擅长的是十进制浮点数学,如果一切都是以2为基数,你就可以了(。
例如,在Chrome中,
0.01 >= 1-0.99
计算结果为false。
这个之前的答案有一个更彻底的解释,包括关于该怎么做的官方答案
但对我来说,在计算之前将所有数字转换为整数美分并不是作弊。许多软件开发都在寻找方法,将正常的人类事物转化为计算机可以有效完成的事情,并将十进制货币表示为整数美分,这在逻辑上是可行的。