每当给出的价格或现金不是整数时,我的收银机功能总是忘记登记最后一分钱



这个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。

这个之前的答案有一个更彻底的解释,包括关于该怎么做的官方答案

但对我来说,在计算之前将所有数字转换为整数美分并不是作弊。许多软件开发都在寻找方法,将正常的人类事物转化为计算机可以有效完成的事情,并将十进制货币表示为整数美分,这在逻辑上是可行的。

最新更新