Cash Register returnCoins function help

Hey all,

I’m having issues with my JS switch statement within my cash register app. This function calculates how much change to return, but it is only returning the default.

function returnCoins(coinChange){
    let changeArr = [];
    switch(coinChange){
    case (coinChange < .05): changeArr.push(["PENNY", coinChange]); break;
    case (coinChange >= .05 && coinChange < .1): changeArr.push([["NICKEL", 0.05], ["PENNY", (coinChange - 0.05)]]); break;
    case (coinChange >= .1 && coinChange < .15): changeArr.push([["DIME", 0.1],["PENNY", (coinChange - 0.1)]]); break;
    case (coinChange >= .15 && coinChange < .2): changeArr.push([["DIME", 0.1], ["NICKEL", 0.05], ["PENNY", (coinChange - 0.15)]]); break;
    case (coinChange >= .2 && coinChange < .25): changeArr.push([["DIME", 0.2], ["PENNY",(coinChange - 0.2)]]); break;
    case (coinChange >= .25 && coinChange < .3): changeArr.push([["QUARTER", 0.25], ["PENNY", (coinChange - 0.25)]]); break;
    case (coinChange >= .3 && coinChange < .35): changeArr.push([["QUARTER", 0.25], ["NICKEL", 0.05], ["PENNY", (coinChange - .3)]]); break;
    case (coinChange >= .35 && coinChange < .4): changeArr.push([["QUARTER", 0.25], ["DIME", 0.1], ["PENNY", (coinChange - 0.35)]]); break;
    case (coinChange >= .4 && coinChange < .45): changeArr.push([["QUARTER", 0.25], ["DIME", 0.1], ["NICKEL", 0.05], ["PENNY", (coinChange - .4)]]); break;
    case (coinChange >= .45 && coinChange < .5): changeArr.push([["QUARTER", 0.25], ["DIME", 0.2], ["PENNY", (coinChange - 0.45)]]); break;
    case (coinChange >= .5 && coinChange < .55): changeArr.push([["QUARTER", 0.50], ["PENNY", (coinChange - .5)]]); break;
    case (coinChange >= .55 && coinChange < .6): changeArr.push([["QUARTER", 0.50], ["NICKEL", 0.05], ["PENNY", (coinChange - 0.55)]]); break;
    case (coinChange >= .6 && coinChange < .65): changeArr.push([["QUARTER", 0.50], ["DIME", 0.1], ["PENNY", (coinChange - .6)]]); break;
    case (coinChange >= .65 && coinChange < .7): changeArr.push([["QUARTER", 0.50], ["DIME", 0.1], ["NICKEL", 0.05], ["PENNY", (coinChange - 0.65)]]); break;
    case (coinChange >= .7 && coinChange < .75): changeArr.push([["QUARTER", 0.50], ["DIME", 0.2], ["PENNY", (coinChange - .7)]]); break;
    case (coinChange >= .75 && coinChange < .8): changeArr.push([["QUARTER", 0.75], ["PENNY", (coinChange - 0.75)]]); break;
    case (coinChange >= .8 && coinChange < .85): changeArr.push([["QUARTER", 0.75], ["NICKEL", 0.05], ["PENNY", (coinChange - 0.8)]]); break;
    case (coinChange >= .85 && coinChange < .9): changeArr.push([["QUARTER", 0.75], ["DIME", 0.1], ["PENNY", (coinChange - 0.85)]]); break;
    case (coinChange >= .9 && coinChange < .95): changeArr.push([["QUARTER", 0.75], ["DIME", 0.1], ["NICKEL", 0.05], ["PENNY", (coinChange - 0.9)]]); break;
    case (coinChange >= .95 && coinChange < .99): changeArr.push([["QUARTER", 0.75], ["DIME", 0.2], ["PENNY", (coinChange - 0.95)]]); break;
    default: changeArr.push(["PENNY", coinChange]); break;
    }
    return changeArr;
  }

  let finChange = returnCoins(changeDue);
  console.log(finChange);

I know there are much more elegant ways to do this, but I’m trying to figure out why my switch cases are not being read. Can anyone explain this to me?

Hi there,
I had a similar problem too. I not 100% sure why but that it is caused because the switch statement does not work well with comparison operations. Try using if/else if/ else statements instead. That seemed to work for me.

Good luck :smiley:

case value: must match the expression in switch(expression). Since coinChange is not a boolean, none of the case statements are executed.

Try changeing switch(coinChange) to switch(true). The first case statement that evaluates to true will be executed.

THANK YOU! You rock, Gomi!

1 Like

Thanks Koboltz! I noticed that it worked with the if/else chain, but I wanted to understand what was wrong with the switch. Looks like I needed to switch to a boolean value in order to make the comparison operations work, since they need to evaluate to true.

remember that

switch(val) {
   case a:
      ... 
    case b:
      ...
}

is equal to

if (val === a) { // switch uses strict equality to compare!
   ...
} else if (val === b) {
   ...
}
1 Like

I had a similar problem too. I not 100% sure why but that it is caused because the switch statement does not work well with comparison operations.