【问题标题】:For loop help in javascript for change calculator用于更改计算器的 javascript 中的循环帮助
【发布时间】:2021-03-01 00:09:39
【问题描述】:

我需要你的帮助来了解我在 for 循环中做错了什么。

我正在尝试编写一个函数来接收账单的总金额和支付账单的总现金。返回一个新对象,该对象描述收银员返还的总零钱。省略我不应该退还的任何类型的更改,即如果我不退还 20 美元的钞票,我不会将其包含在结果中。

我确实得到了带有结果的对象,但不是预期的美元值之间的分割方式。

我希望得到这个结果:

{ tenDollar: 1, twoDollar: 1, oneDollar: 1, quarter: 3, penny: 2 }

但是得到这个:

{ tenDollar: 1, twoDollar: 0, oneDollar: 3, quarter: 0, dime: 7, penny: 7}

代码实现:


const calculateChange = function(total, cash) {
  // Your code here
  let arr = [];
  let change = cash - total;
  //console.log(change);
  //creates an aaray of split numbers 
    var i = 1;
    while (change > 0) {
      arr.unshift((change % 10) * i);
      change = Math.floor(change / 10);
      i *= 10
    }
  let changeType = {tenDollar: 0, twoDollar: 0, oneDollar: 0, quarter: 0, dime: 0, penny: 0};
    
    for(i = 0; i < arr.length; i++) {

      if (arr[i] % 1000 === 0) {
        changeType.tenDollar = arr[i] / 1000;
      } else if (arr[i] % 200 === 0 && arr[i] >=200 ) {
        changeType.twoDollar = arr[i] / 200;
      } else if (arr[i] % 100 === 0) {
        changeType.oneDollar = arr[i] / 100;
      } else if (arr[i] % 25 === 0) {
        changeType.quarter = arr[i] / 25;
      } else if (arr[i] % 10 === 0) {
        changeType.dime = arr[i] / 10;
      } else if (arr[i] % 1 === 0) {
        changeType.penny = arr[i] / 1;
      }
    }
  return changeType;
};
  console.log(calculateChange(2623, 4000));

【问题讨论】:

    标签: javascript arrays for-loop object


    【解决方案1】:

    我会这样做:

    const moneys =
      [ { face: 'fiftyDollar',  val: 50   *100 }
      , { face: 'twentyDollar', val: 20   *100 }
      , { face: 'tenDollar',    val: 10   *100 }
      , { face: 'twoDollar',    val:  2   *100 }
      , { face: 'oneDollar',    val:  1   *100 }
      , { face: 'quarter',      val:  .25 *100 }
      , { face: 'dime',         val:  .1  *100 }
      , { face: 'penny',        val:  .01 *100 }
      ]
    
    const calculateChange = (total, cash) =>
      {
      let result = {}
        , change = cash - total  
        ;
      moneys.forEach( ({face,val}) =>
        {
        let count = Math.floor(change / val)
        change   %= val
        if (count > 0) result[face] = count
        })
      return result
      }
    
    console.log( JSON.stringify( calculateChange( 2623, 4000 )) )
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    您的代码逻辑被扭曲了,因为您试图匹配 2 个不同的套件。第一个序列arr 以十次方(1000,100,10,1) 前进,而由于$ 20quarters ($ 0.25),它的展开是不同的。 在您的测试 (arr = [1000,300,70,7]) 中,70c 无法返回预期的3 quarters,因为在下一个分区中将缺少7c5c

    我们可以用你的逻辑做的最好的代码是(但它永远不会给出你期望的结果):

    const calculateChange = function(total, cash)
      {
      let arr    = []
        , change = cash - total
        ;
      // console.log(`${cash} - ${total} = ${change}`);
      //creates an aaray of split numbers 
        var i = 1;
        while (change > 0)
          {
          arr.push((change % 10) * i);
          change = Math.floor(change / 10);
          // console.log( i, JSON.stringify(arr), change, (i*10))
          i *= 10
          }
      // console.log( 'arr =', JSON.stringify(arr), ' = ',arr.reduce((a,c)=>a+c,0))
    
      let changeType = {};
        
      for(i=arr.length; i--;)
        {
        let tenP = 10**i
        if (tenP === 1000 && arr[i] >= 1000 ) { changeType.tenDollar = arr[i] / 1000;                           } 
        if (tenP ===  100 && arr[i] >=  200 ) { changeType.twoDollar = Math.floor(arr[i] / 200); arr[i] %= 200; } 
        if (tenP ===  100 && arr[i] >=  100 ) { changeType.oneDollar = arr[i] / 100;                            } 
        if (tenP ===   10 && arr[i] >=   25 ) { changeType.quarter   = Math.floor(arr[i] / 25);  arr[i] %= 25;  } 
        if (tenP ===   10 && arr[i] >=   10 ) { changeType.dime      = arr[i] / 10;                             } 
        if (tenP ===    1 && arr[i] >     0 ) { changeType.penny     = arr[i];                                  } 
        }
    
      return changeType;
      }
    console.log( JSON.stringify( calculateChange(2623, 4000)))
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 感谢您为回答所做的努力。我运行了这段代码,但它没有输出我在帖子中提到的预期结果。
    • @RashadBayram 是的,我不明白您的初始值已经以百分之一表示。我更正了我的代码。
    • 谢谢你成功了。我只是将 document.write 更改为 concole.log,因为我在我的机器上本地运行代码。
    • @RashadBayram 我在回答中添加了我对初始代码问题的分析
    • 非常感谢。那是我需要的。在我的代码中解释我的逻辑问题。我非常感谢您的努力。
    【解决方案2】:

    我觉得你的方法不对,

    这是解决类似问题的真正方法

    (function () {
      var app = angular.module("calcApp", []);
      app.controller("calcController", function () {
        this.amountChange = function (amount, money) {
          //if(form.$invalid)
          //return alert("Please check form and enter correct values");
    
          var change = money - amount;
    
          var remaining = change * 100;
    
          var calcQuarter = Math.floor(remaining / 25);
          remaining = remaining % 25;
    
          var calcDime = Math.floor(remaining / 10);
          remaining = remaining % 10;
    
          var calcNickel = Math.floor(remaining / 5);
          remaining = remaining % 5;
    
          var calcPenny = Math.floor(remaining / 1);
          alert(
            "\nThe total was $" +
              amount +
              " with " +
              "$" +
              money +
              " tendered.\n\nPlease return $" +
              change.toFixed(2) +
              ":  " +
              calcQuarter +
              " quarters, " +
              calcDime +
              " dimes, " +
              calcNickel +
              " nickels, and " +
              calcPenny +
              " pennies, Thank you!"
          );
        };
      });
    })();
    

    可以找到完整代码here

    【讨论】:

    • 我需要坚持我用 2 个参数编写的函数的格式。即使您的代码做了类似的工作,我也需要能够在我自己编写的 for 循环(我提供的那个)中找到逻辑错误。对我来说这是一个学习过程。
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2011-10-13
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多