我正在尝试制作一个函数,该函数接受一定数量的现金,并从现有变量中扣除构成该现金数量所需的硬币/纸币数量。我的代码如下所示:
var changeDue = 34.66;
// get number of each coin
var penny = 50;
var nickel = 50;
var dime = 50;
var quarter = 50;
var one = 50;
var five = 50;
var ten = 50;
var twenty = 50;
var hundred = 50;
function getChange(due) {
var currentDue = due;
while(currentDue > 0) {
if(currentDue >= 100 && hundred > 0){
hundred--;
currentDue -= 100;
}
else if(currentDue >= 20 && twenty > 0) {
twenty--;
currentDue -= 20;
}
else if(currentDue >= 10 && ten > 0) {
ten--;
currentDue -= 10;
}
else if(currentDue >= 5 && five > 0) {
five--;
currentDue -= 5;
}
else if(currentDue >= 1 && one > 0) {
one--;
currentDue -= 1;
}
else if(currentDue >= 0.25 && quarter > 0) {
quarter--;
currentDue -= 0.25;
}
else if(currentDue >= 0.1 && dime > 0) {
dime--;
currentDue -= 0.1;
}
else if(currentDue >= 0.05 && nickel > 0) {
nickel--;
currentDue -= 0.05;
}
else if(currentDue >= 0.01 && penny > 0) {
penny--;
currentDue -= 0.01;
}
}
console.log(currentDue);
}
getChange(changeDue);
我试图用 while 循环做的是检查应付的找零金额是否高于某个钞票/硬币,比如一百,并且仍然有这个值(value)的硬币或钞票可用,然后从更改应付金额和硬币/纸币数量。但这会导致无限循环,所以我无法调试它。
我认为,因为我总是从 currentDue 中扣除,并且我设置了如此多的硬币和钞票,所以我不会有这样的问题,但我有。有人可以指出我做错了什么吗?
谢谢
最佳答案
循环可能无限的原因有两个:
- floating point numbers 的不精确性, JavaScript 和其他语言用来表示带小数位的数字
- 事实上,如果你用完了硬币,就没有办法退出循环
在这个例子中,第一个是原因,但你应该同时解决这两个问题。
要解决第一个问题,您可以执行以下两项操作之一。您可以将所有内容乘以 100 以使用整数,然后在最后除以 100 以获得答案,如下所示:
if(currentDue >= 10000 && hundred > 0){
hundred--;
currentDue -= 10000;
}
...
console.log(currentDue / 100);
或者您可以使用 Math.round()
,像这样:
if(currentDue >= 100 && hundred > 0){
hundred -= 1;
currentDue = Math.round(currentDue - 100);
}
如果这很重要,那么第一个解决方案的性能会更高。否则,请自行选择。
为了解决第二个问题,如果以上条件都不成立,您可以添加一个 break 语句:
...
else {
break;
}
关于javascript - 为什么我的 while 循环是无限的?每次都更改变量,但条件仍然始终为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35374801/