javascript - 为什么我的 while 循环是无限的?每次都更改变量,但条件仍然始终为真

标签 javascript

我正在尝试制作一个函数,该函数接受一定数量的现金,并从现有变量中扣除构成该现金数量所需的硬币/纸币数量。我的代码如下所示:

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 中扣除,并且我设置了如此多的硬币和钞票,所以我不会有这样的问题,但我有。有人可以指出我做错了什么吗?

谢谢

最佳答案

循环可能无限的原因有两个:

  1. floating point numbers 的不精确性, JavaScript 和其他语言用来表示带小数位的数字
  2. 事实上,如果你用完了硬币,就没有办法退出循环

在这个例子中,第一个是原因,但你应该同时解决这两个问题。

要解决第一个问题,您可以执行以下两项操作之一。您可以将所有内容乘以 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/

相关文章:

javascript - 背景图像在 Ionic/Javascript/Angular 中不起作用

javascript - 使用 Javascript 通过链接抓取并发送文本值

javascript - Firefox 23 中的 QUnit 测试 : "TypeError: document.setUserData is not a function"

javascript - 更改下拉列表后,我将如何重定向到另一个 URL

javascript - highcharts 的标注 CSS 实现不起作用

javascript - 如何在 Angular2 rc5 中获取路由参数?

javascript - 无法获得有效的正则表达式以在 Node.js 中工作

javascript - JS函数对象如何在内存中存储?

javascript - Vue.js - 检测是否断开连接

javascript - 更改节点类型