Build a Cash Register

Please help me…
I enter the test case values and the output results looks fine, but for some reason the test of No.12, 13, 18, and 19 does not pass.
What is wrong with my code?
I can’t figure it out, no matter how many times I look back at it.

<!DOCTYYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="styles.css">
    <title>Cash Register</title>
  </head>
  <body>
    <main>
      <img class="freecodecamp-logo" src="https://cdn.freecodecamp.org/platform/universal/fcc_primary.svg" alt="freeCodeCamp Logo" width="265">
      <h1>Cash Register Project</h1>
      <div id="change-due">
        <p id="change-status"></p>
        <p id="change-hundred"></p>
        <p id="change-twenty"></p>
        <p id="change-ten"></p>
        <p id="change-five"></p>
        <p id="change-one"></p>
        <p id="change-quarter"></p>
        <p id="change-dime"></p>
        <p id="change-nickel"></p>
        <p id="change-penny"></p>
      </div>

      <div id="input-div">
        <label for="cash">Enter cash from customer:</label>
        <input id="cash" type="number">
        <button id="purchase-btn">Purchase</button>
      </div>
      <div id="drawer-top">
        <p id="price"></p>   
      </div>
      <div id="drawer-middle">
        <div class="drawer-middle-pattern">
          <span id="pattern1"><span>
          <span id="pattern2"><span>
          <span id="pattern3"><span>
          <span id="pattern4"><span>
          <span id="pattern5"><span>
          <span id="pattern6"><span>
          <span id="pattern7"><span>
          <span id="pattern8"><span>
          <span id="pattern9"><span>
        </div>
        <div class="drawer-middle-display">
            <p id="drawer-title">Change in drawer:</p>
          <span>
            <p id="drawer-pennies"></p>
            <p id="drawer-nickels"></p>
            <p id="drawer-dimes"></p>
            <p id="drawer-quarters"></p>
            <p id="drawer-ones"></p>
            <p id="drawer-fives"></p>
            <p id="drawer-tens"></p>
            <p id="drawer-twenties"></p>
            <p id="drawer-hundreds"></p>
          </span>
        </div>
      </div>
      <div id="drawer-bottom">
        <span id="drawer-bottom-pattern"></span>
      </div>
    </main>
  </body>
  <script src="script.js"></script>
</html>
let price = 19.5;
let cid = [
  ['PENNY', 0.05],
  ['NICKEL', 0],
  ['DIME', 0],
  ['QUARTER', 0],
  ['ONE', 0],
  ['FIVE', 0],
  ['TEN', 0],
  ['TWENTY', 0],
  ['ONE HUNDRED', 100]
];

let purchaseBtnCount = 0;
let cashStock;
let result;


// get HTMl elements
const changeStatus = document.getElementById('change-status');
const changeHundred = document.getElementById('change-hundred');
const changeTwenty = document.getElementById('change-twenty');
const changeTen = document.getElementById('change-ten');
const changeFive = document.getElementById('change-five');
const changeOne = document.getElementById('change-one');
const changeQuarter = document.getElementById('change-quarter');
const changeDime = document.getElementById('change-dime');
const changeNickel = document.getElementById('change-nickel');
const changePenny = document.getElementById('change-penny');

const cash = document.getElementById('cash');
const purchaseBtn = document.getElementById('purchase-btn');
const priceElement = document.getElementById('price');

const drawerPennies = document.getElementById('drawer-pennies');
const drawerNickels = document.getElementById('drawer-nickels');
const drawerDimes = document.getElementById('drawer-dimes');
const drawerQuarters = document.getElementById('drawer-quarters');
const drawerOnes = document.getElementById('drawer-ones');
const drawerFives = document.getElementById('drawer-fives');
const drawerTens = document.getElementById('drawer-tens');
const drawerTwenties = document.getElementById('drawer-twenties');
const drawerHundreds = document.getElementById('drawer-hundreds');

// Display price
priceElement.innerHTML = `<p>Price: $${price}</p>`;

// Display drawer
const penny = cid.find(coin => coin[0] === 'PENNY');
drawerPennies.innerHTML = `<p>Pennies: $${penny[1]}</p>`;
const nickel = cid.find(coin => coin[0] === 'NICKEL');
drawerNickels.innerHTML = `<p>Nickels: $${nickel[1]}</p>`;
const dime = cid.find(coin => coin[0] === 'QUARTER');
drawerDimes.innerHTML = `<p>Dimes: $${dime[1]}</p>`;
const quarter = cid.find(coin => coin[0] === 'QUARTER');
drawerQuarters.innerHTML = `<p>Quarters: $${quarter[1]}</p>`;
const one = cid.find(coin => coin[0] === 'ONE');
drawerOnes.innerHTML = `<p>Ones: $${one[1]}</p>`;
const five = cid.find(coin => coin[0] === 'FIVE');
drawerFives.innerHTML = `<p>Fives: $${five[1]}</p>`;
const ten = cid.find(coin => coin[0] === 'TEN');
drawerTens.innerHTML = `<p>Tens: $${ten[1]}</p>`;
const tenty = cid.find(coin => coin[0] === 'TWENTY');
drawerTwenties.innerHTML = `<p>Twenties: $${tenty[1]}</p>`;
const hundred = cid.find(coin => coin[0] === 'ONE HUNDRED');
drawerHundreds.innerHTML = `<p>Hundreds: $${hundred[1]}</p>`;

// Reset #change-due
const resetChangeDue = () => {
  changeHundred.innerHTML = '';
  changeTwenty.innerHTML = '';
  changeTen.innerHTML = '';
  changeFive.innerHTML = '';
  changeOne.innerHTML = '';
  changeQuarter.innerHTML = '';
  changeDime.innerHTML = '';
  changeNickel.innerHTML = '';
  changePenny.innerHTML = '';
};

// Check register cash's count
const checkRegister = (availableCid, difference) => {
  const hundredIndex = availableCid.findIndex(coin => coin[0] === 'ONE HUNDRED');
  const twentyIndex = availableCid.findIndex(coin => coin[0] === 'TWENTY');
  const tenIndex = availableCid.findIndex(coin => coin[0] === 'TEN');
  const fiveIndex = availableCid.findIndex(coin => coin[0] === 'FIVE');
  const oneIndex = availableCid.findIndex(coin => coin[0] === 'ONE');
  const quarterIndex = availableCid.findIndex(coin => coin[0] === 'QUARTER');
  const dimeIndex = availableCid.findIndex(coin => coin[0] === 'DIME');
  const nickelIndex = availableCid.findIndex(coin => coin[0] === 'NICKEL');
  const pennyIndex = availableCid.findIndex(coin => coin[0] === 'PENNY');

  // Now you can access the coin name using index 0
  const hundred = availableCid[hundredIndex][1];
  const twenty = availableCid[twentyIndex][1];
  const ten = availableCid[tenIndex][1];
  const five = availableCid[fiveIndex][1];
  const one = availableCid[oneIndex][1];
  const quarter = availableCid[quarterIndex][1];
  const dime = availableCid[dimeIndex][1];
  const nickel = availableCid[nickelIndex][1];
  const penny = availableCid[pennyIndex][1];

  return cashStock = {
    hundred,
    twenty,
    ten,
    five,
    one,
    quarter,
    dime,
    nickel,
    penny
  };
};

// Check coin pattern
const checkCoinPattern = (availableCid, difference) => {
  availableCid = cid.slice();
  cashStock = checkRegister(availableCid, difference);

  let numHundred = 0;
  let numTwenty = 0;
  let numTen = 0;
  let numFive = 0;
  let numOne = 0;
  let numQuarter = 0;
  let numDime = 0;
  let numNickel = 0;
  let numPenny = 0;
  let leftHundred = 0;
  let leftTwenty = 0;
  let leftTen = 0;
  let leftFive = 0;
  let leftOne = 0;
  let leftQuarter = 0;
  let leftDime = 0;
  let leftNickel = 0;
  let leftPenny = 0;
  let changeFlg = false;

  // Calc cash
  if (difference >= 100 && cashStock.hundred !== 0) {
    if (difference <= cashStock.hundred) {
      numHundred = Math.floor(difference / 100) * 100;
    } else {
      numHundred = cashStock.hundred;
    }
      difference = (difference - numHundred).toFixed(2);
      leftHundred = cashStock.hundred - numHundred;
    }
    
    if (difference >= 20 && cashStock.twenty !== 0) {
      if (difference <= cashStock.twenty) {
        numTwenty = Math.floor(difference / 20) * 20;
      } else {
        numTwenty = cashStock.twenty;
      }
        difference = (difference - numTwenty).toFixed(2);
        leftTwenty = cashStock.twenty - numTwenty; 
      }

    if (difference >= 10 && cashStock.ten !== 0) {
      if (difference <= cashStock.ten) {
        numTen = Math.floor(difference / 10) * 10;
      } else {
        numTen = cashStock.ten;
      }
      difference = (difference - numTen).toFixed(2);
      leftTen = cashStock.ten - numTen;
    }

    if (difference >= 5 && cashStock.five !== 0) {
      if (difference <= cashStock.five) {
        numFive = Math.floor(difference / 5) * 5;
      } else {
        numFive = cashStock.five;
      }
        difference = (difference - numFive).toFixed(2);
        leftFive = cashStock.five - numFive;
      }
      
      if (difference >= 1 && cashStock.one !== 0) {
        if (difference <= cashStock.one) {
            numOne = Math.floor(difference);
        } else {
          numTen = cashStock.one;
        }
          difference = (difference - numOne).toFixed(2);
          leftOne = cashStock.one - numOne;
        }

        if (difference >= 0.25 && cashStock.quarter !== 0) {
          if (difference <= cashStock.quarter) {
            numQuarter = Math.floor(difference / 0.25) * 0.25;
          } else {
            numQuarter = cashStock.quarter;
          }
          difference = (difference - numQuarter).toFixed(2);
          leftQuarter = cashStock.quarter - numQuarter;
        }

        if (difference >= 0.1 && cashStock.dime !== 0) {
          if (difference <= cashStock.dime) {
            numDime = Math.floor(difference / 0.1) * 0.1;
          } else {
              numDime = cashStock.dime;
          }
          difference = (difference - numDime).toFixed(2);
          leftDime = cashStock.dime - numDime;
        }

        if (difference >= 0.05 && cashStock.nickel !== 0) {
          if (difference <= cashStock.nickel) {
              numNickel = Math.floor(difference / 0.05) * 0.05;
          } else {
            numNickel = cashStock.nickel;
          }
          difference = (difference - numNickel).toFixed(2);
          leftNickel = cashStock.nickel - numNickel;
        }

        if (difference >= 0.01) {
          if (difference <= cashStock.penny) {
            numPenny = Math.floor(difference / 0.01) * 0.01;
          } else {
            numPenny = cashStock.penny;
          }
          difference = (difference - numPenny).toFixed(2);
          leftPenny = cashStock.penny - numPenny;
        }

        if (difference >= 0.001) {
          changeFlg = false;
        } else {
          changeFlg = true;
        }
        
        return result =
       {
        numHundred,
        numTwenty,
        numTen,
        numFive,
        numOne,
        numQuarter,
        numDime,
        numNickel,
        numPenny,
        leftHundred,
        leftTwenty,
        leftTen,
        leftFive,
        leftOne,
        leftQuarter,
        leftDime,
        leftNickel,
        leftPenny,
        changeFlg
      };

};

purchaseBtn.addEventListener('click', () => {
  resetChangeDue();
  // Check inputted cash
  // Not enough cash
  if (parseFloat(cash.value) < price) {
    alert('Customer does not have enough money to purchase the item');
  }
  // No cash
  if (parseFloat(cash.value) === price) {
    changeStatus.innerHTML = '<p>No change due - customer paid with exact cash</p>';
  }

  // Calcurate cash
  let availableCid = [];

  if (parseFloat(cash.value) > price) {
    purchaseBtnCount++;
    if (purchaseBtnCount === 1) {
      availableCid = cid.slice();
      // Get left register cash
    } else {
      availableCid = [
        ['PENNY', parseFloat(drawerPennies.innerText.slice(11))],
        ['NICKEL', parseFloat(drawerNickels.innerText.slice(10))],
        ['DIME', parseFloat(drawerDimes.innerText.slice(8))],
        ['QUARTER', parseFloat(drawerQuarters.innerText.slice(11))],
        ['ONE', parseFloat(drawerOnes.innerText.slice(7))],
        ['FIVE', parseFloat(drawerFives.innerText.slice(8))],
        ['TEN', parseFloat(drawerTens.innerText.slice(7))],
        ['TWENTY', parseFloat(drawerTwenties.innerText.slice(11))],
        ['ONE HUNDRED', parseFloat(drawerHundreds.innerText.slice(11))]
      ];
    }

    // Calcurate register total
    let totalCid = parseFloat(availableCid.reduce((total, coin) => total + coin[1], 0).toFixed(2));
    // Calcurate register total
    let difference = Number(cash.value) - price;

    // Check lack of change
    if (difference > totalCid) {
      changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
    }

    result = checkCoinPattern(availableCid, difference);

    // Check coin pattern
    if (!result.changeFlg) {
      // Enable to return change
      changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
    // Return changes
    } else {
      // Display #change-due
      result.numHundred !== 0 ? 
        changeHundred.innerHTML = `<p>ONE HUNDRED: $${result.numHundred}</p>` : '';

      result.numTwenty !== 0 ? 
        changeTwenty.innerHTML = `<p>TWENTY: $${result.numTwenty}</p>` : '';

      result.numTen !== 0 ? 
        changeTen.innerHTML = `<p>TEN: $${result.numTen}</p>` : '';

      result.numFive !== 0 ? 
        changeFive.innerHTML = `<p>FIVE: $${result.numFive}</p>` : '';
      
      result.numOne !== 0 ? 
        changeOne.innerHTML = `<p>ONE: $${result.numOne}</p>` : '';
      
      result.numQuarter !== 0 ? 
        changeQuarter.innerHTML = `<p>QUARTER: $${result.numQuarter}</p>` : '';
      
      result.numDime !== 0 ? 
        changeDime.innerHTML = `<p>DIME: $${result.numDime}</p>` : '';
      
      result.numNickel !== 0 ? 
        changeNickel.innerHTML = `<p>NICKEL: $${result.numNickel}</p>` : '';
      
      result.numPenny !== 0 ? 
        changePenny.innerHTML = `<p>PENNY: $${result.numPenny}</p>` : '';

      // Update drawer
      drawerPennies.innerHTML = `<p>Pennies: $${result.leftPenny}</p>`;
      drawerNickels.innerHTML = `<p>Nickels: $${result.leftNickel}</p>`;
      drawerDimes.innerHTML = `<p>Dimes: $${result.leftDime}</p>`;
      drawerQuarters.innerHTML = `<p>Quarters: $${result.leftQuarter}</p>`;
      drawerOnes.innerHTML = `<p>Ones: $${result.leftOne}</p>`;
      drawerFives.innerHTML = `<p>Fives: $${result.leftFive}</p>`;
      drawerTens.innerHTML = `<p>Tens: $${result.leftTen}</p>`;
      drawerTwenties.innerHTML = `<p>Twenties: $${result.leftTwenty}</p>`;
      drawerHundreds.innerHTML = `<p>Hundreds: $${result.leftHundred}</p>`;
      
      // Change Status
      if (price < parseFloat(cash.value) && difference.toFixed(2) < totalCid) { 
      changeStatus.innerHTML = '<p>Status: OPEN</p>';
      } else {
      changeStatus.innerHTML = '<p>Status: CLOSED</p>';
      }
    }
  }
});

I’ve edited your code for readability. When you enter a code block into a forum post, please precede it with a separate line of three backticks and follow it with a separate line of three backticks to make it easier to read.

You can also use the “preformatted text” tool in the editor (</>) to add backticks around text.

See this post to find the backtick on your keyboard.
Note: Backticks (`) are not single quotes (').

1 Like

This is my first post, and I was just looking up how to use it because the code didn’t show up as I wanted it to.
I appreciate not only your kind instructions, but also your correction!!!

1 Like

What is the purpose of this variable ? And why is it in the global scope?

Note that the tests only load your code once and then they run in sequence so this value will only be set to zero once and never again.

Edit: the cid may however change between runs and if your code does not check the cid each and every time the purchase button is clicked, your code will run fail the tests.

Thank you for taking the time to do this for me.

To calculate the change when the button is pressed in succession, taking over the state in which the change was returned the last time,
A variable is declared to see how many times the button has been counted.
However, there was no need to make it a global variable, so we changed it to only the first time it is loaded.
However, I still can’t get Nos. 13-19 to pass.

let price = 19.5;
let cid = [
  ['PENNY', 0.5],
  ['NICKEL', 0],
  ['DIME', 0],
  ['QUARTER', 0],
  ['ONE', 0],
  ['FIVE', 0],
  ['TEN', 0],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];

let cashStock;
let result;
let purchaseBtnCount;
let availableCid = [];

// get HTMl elements
const changeStatus = document.getElementById('change-status');
const changeHundred = document.getElementById('change-hundred');
const changeTwenty = document.getElementById('change-twenty');
const changeTen = document.getElementById('change-ten');
const changeFive = document.getElementById('change-five');
const changeOne = document.getElementById('change-one');
const changeQuarter = document.getElementById('change-quarter');
const changeDime = document.getElementById('change-dime');
const changeNickel = document.getElementById('change-nickel');
const changePenny = document.getElementById('change-penny');

const cash = document.getElementById('cash');
const purchaseBtn = document.getElementById('purchase-btn');
const priceElement = document.getElementById('price');

const drawerPennies = document.getElementById('drawer-pennies');
const drawerNickels = document.getElementById('drawer-nickels');
const drawerDimes = document.getElementById('drawer-dimes');
const drawerQuarters = document.getElementById('drawer-quarters');
const drawerOnes = document.getElementById('drawer-ones');
const drawerFives = document.getElementById('drawer-fives');
const drawerTens = document.getElementById('drawer-tens');
const drawerTwenties = document.getElementById('drawer-twenties');
const drawerHundreds = document.getElementById('drawer-hundreds');

// Display price
priceElement.innerHTML = `<p>Price: $${price}</p>`;

// Display drawer
const penny = cid.find(coin => coin[0] === 'PENNY');
drawerPennies.innerHTML = `<p>Pennies: $${penny[1]}</p>`;
const nickel = cid.find(coin => coin[0] === 'NICKEL');
drawerNickels.innerHTML = `<p>Nickels: $${nickel[1]}</p>`;
const dime = cid.find(coin => coin[0] === 'QUARTER');
drawerDimes.innerHTML = `<p>Dimes: $${dime[1]}</p>`;
const quarter = cid.find(coin => coin[0] === 'QUARTER');
drawerQuarters.innerHTML = `<p>Quarters: $${quarter[1]}</p>`;
const one = cid.find(coin => coin[0] === 'ONE');
drawerOnes.innerHTML = `<p>Ones: $${one[1]}</p>`;
const five = cid.find(coin => coin[0] === 'FIVE');
drawerFives.innerHTML = `<p>Fives: $${five[1]}</p>`;
const ten = cid.find(coin => coin[0] === 'TEN');
drawerTens.innerHTML = `<p>Tens: $${ten[1]}</p>`;
const tenty = cid.find(coin => coin[0] === 'TWENTY');
drawerTwenties.innerHTML = `<p>Twenties: $${tenty[1]}</p>`;
const hundred = cid.find(coin => coin[0] === 'ONE HUNDRED');
drawerHundreds.innerHTML = `<p>Hundreds: $${hundred[1]}</p>`;

// Reset #change-due
const resetChangeDue = () => {
  changeHundred.innerHTML = '';
  changeTwenty.innerHTML = '';
  changeTen.innerHTML = '';
  changeFive.innerHTML = '';
  changeOne.innerHTML = '';
  changeQuarter.innerHTML = '';
  changeDime.innerHTML = '';
  changeNickel.innerHTML = '';
  changePenny.innerHTML = '';
};

// Check register cash's count
const checkRegister = (availableCid, difference) => {
  const hundredIndex = availableCid.findIndex(coin => coin[0] === 'ONE HUNDRED');
  const twentyIndex = availableCid.findIndex(coin => coin[0] === 'TWENTY');
  const tenIndex = availableCid.findIndex(coin => coin[0] === 'TEN');
  const fiveIndex = availableCid.findIndex(coin => coin[0] === 'FIVE');
  const oneIndex = availableCid.findIndex(coin => coin[0] === 'ONE');
  const quarterIndex = availableCid.findIndex(coin => coin[0] === 'QUARTER');
  const dimeIndex = availableCid.findIndex(coin => coin[0] === 'DIME');
  const nickelIndex = availableCid.findIndex(coin => coin[0] === 'NICKEL');
  const pennyIndex = availableCid.findIndex(coin => coin[0] === 'PENNY');

  // Now you can access the coin name using index 0
  const hundred = availableCid[hundredIndex][1];
  const twenty = availableCid[twentyIndex][1];
  const ten = availableCid[tenIndex][1];
  const five = availableCid[fiveIndex][1];
  const one = availableCid[oneIndex][1];
  const quarter = availableCid[quarterIndex][1];
  const dime = availableCid[dimeIndex][1];
  const nickel = availableCid[nickelIndex][1];
  const penny = availableCid[pennyIndex][1];

  return cashStock = {
    hundred,
    twenty,
    ten,
    five,
    one,
    quarter,
    dime,
    nickel,
    penny
  };
};

// Check coin pattern
const checkCoinPattern = (availableCid, difference) => {
  cashStock = checkRegister(availableCid, difference);

  let numHundred = 0;
  let numTwenty = 0;
  let numTen = 0;
  let numFive = 0;
  let numOne = 0;
  let numQuarter = 0;
  let numDime = 0;
  let numNickel = 0;
  let numPenny = 0;
  let leftHundred = cashStock.hundred;
  let leftTwenty = cashStock.twenty;
  let leftTen = cashStock.ten;
  let leftFive = cashStock.five;
  let leftOne = cashStock.one;
  let leftQuarter = cashStock.quarter;
  let leftDime = cashStock.dime;
  let leftNickel = cashStock.nickel;
  let leftPenny = cashStock.penny;
  let changeFlg = false;

  // Calc cash
  if (difference >= 100 && cashStock.hundred !== 0) {
    if (difference <= cashStock.hundred) {
      numHundred = Math.floor(difference / 100) * 100;
    } else {
      numHundred = cashStock.hundred;
    }
      difference = (difference - numHundred).toFixed(2);
      leftHundred = cashStock.hundred - numHundred;
    }

    if (difference >= 20 && cashStock.twenty !== 0) {
      if (difference <= cashStock.twenty) {
        numTwenty = Math.floor(difference / 20) * 20;
      } else {
        numTwenty = cashStock.twenty;
      }
        difference = (difference - numTwenty).toFixed(2);
        leftTwenty = cashStock.twenty - numTwenty; 
      }

    if (difference >= 10 && cashStock.ten !== 0) {
      if (difference <= cashStock.ten) {
        numTen = Math.floor(difference / 10) * 10;
      } else {
        numTen = cashStock.ten;
      }
      difference = (difference - numTen).toFixed(2);
      leftTen = cashStock.ten - numTen;
    }

    if (difference >= 5 && cashStock.five !== 0) {
      if (difference <= cashStock.five) {
        numFive = Math.floor(difference / 5) * 5;
      } else {
        numFive = cashStock.five;
      }
        difference = (difference - numFive).toFixed(2);
        leftFive = cashStock.five - numFive;
      }
      
      if (difference >= 1 && cashStock.one !== 0) {
        if (difference <= cashStock.one) {
            numOne = Math.floor(difference);
        } else {
          numTen = cashStock.one;
        }
          difference = (difference - numOne).toFixed(2);
          leftOne = cashStock.one - numOne;
        }

        if (difference >= 0.25 && cashStock.quarter !== 0) {
          if (difference <= cashStock.quarter) {
            numQuarter = Math.floor(difference / 0.25) * 0.25;
          } else {
            numQuarter = cashStock.quarter;
          }
          difference = (difference - numQuarter).toFixed(2);
          leftQuarter = cashStock.quarter - numQuarter;
        }

        if (difference >= 0.1 && cashStock.dime !== 0) {
          if (difference <= cashStock.dime) {
            numDime = Math.floor(difference / 0.1) * 0.1;
          } else {
              numDime = cashStock.dime;
          }
          difference = (difference - numDime).toFixed(2);
          leftDime = (cashStock.dime - numDime).toFixed(2);
        }

        if (difference >= 0.05 && cashStock.nickel !== 0) {
          if (difference <= cashStock.nickel) {
              numNickel = Math.floor(difference / 0.05) * 0.05;
          } else {
            numNickel = cashStock.nickel;
          }
          difference = (difference - numNickel).toFixed(2);
          leftNickel = cashStock.nickel - numNickel;
        }

        if (difference >= 0.01) {
          if (difference <= cashStock.penny) {
            numPenny = Math.floor(difference / 0.01) * 0.01;
          } else {
            numPenny = cashStock.penny;
          }
          difference = (difference - numPenny).toFixed(2);
          leftPenny = cashStock.penny - numPenny;
        }

        if (difference >= 0.001) {
          changeFlg = false;
        } else {
          changeFlg = true;
        }
        
        return result =
       {
        numHundred,
        numTwenty,
        numTen,
        numFive,
        numOne,
        numQuarter,
        numDime,
        numNickel,
        numPenny,
        leftHundred,
        leftTwenty,
        leftTen,
        leftFive,
        leftOne,
        leftQuarter,
        leftDime,
        leftNickel,
        leftPenny,
        changeFlg
      };

};

window.onload = function() {
  purchaseBtnCount = 0;
};

purchaseBtn.addEventListener('click', () => {
  resetChangeDue();
  // Check inputted cash
  // Not enough cash
  if (parseFloat(cash.value) < price) {
    alert('Customer does not have enough money to purchase the item');
  }
  // No cash
  if (parseFloat(cash.value) === price) {
    changeStatus.innerHTML = '<p>No change due - customer paid with exact cash</p>';
  }

  // Calcurate cash
  if (parseFloat(cash.value) > price) {
    purchaseBtnCount++;
    if (purchaseBtnCount <= 1) {
      availableCid = cid.slice();
    }

    // Calcurate register total
    let totalCid = parseFloat(availableCid.reduce((total, coin) => total + coin[1], 0).toFixed(2));
    // Calcurate register total
    let difference = parseFloat(cash.value) - price;

    // Check lack of change
    if (difference > totalCid) {
      changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
    }

    result = checkCoinPattern(availableCid, difference);

    // Check coin pattern
    if (!result.changeFlg) {
      // Enable to return change
      changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
    // Return changes
    } else {
      // Display #change-due
      result.numHundred !== 0 ? 
        changeHundred.innerHTML = `<p>ONE HUNDRED: $${result.numHundred}</p>` : '';

      result.numTwenty !== 0 ? 
        changeTwenty.innerHTML = `<p>TWENTY: $${result.numTwenty}</p>` : '';

      result.numTen !== 0 ? 
        changeTen.innerHTML = `<p>TEN: $${result.numTen}</p>` : '';

      result.numFive !== 0 ? 
        changeFive.innerHTML = `<p>FIVE: $${result.numFive}</p>` : '';
      
      result.numOne !== 0 ? 
        changeOne.innerHTML = `<p>ONE: $${result.numOne}</p>` : '';
      
      result.numQuarter !== 0 ? 
        changeQuarter.innerHTML = `<p>QUARTER: $${result.numQuarter}</p>` : '';
      
      result.numDime !== 0 ? 
        changeDime.innerHTML = `<p>DIME: $${result.numDime}</p>` : '';
      
      result.numNickel !== 0 ? 
        changeNickel.innerHTML = `<p>NICKEL: $${result.numNickel}</p>` : '';
      
      result.numPenny !== 0 ? 
        changePenny.innerHTML = `<p>PENNY: $${result.numPenny}</p>` : '';

      // Update drawer
      drawerPennies.innerHTML = `<p>Pennies: $${result.leftPenny}</p>`;
      drawerNickels.innerHTML = `<p>Nickels: $${result.leftNickel}</p>`;
      drawerDimes.innerHTML = `<p>Dimes: $${result.leftDime}</p>`;
      drawerQuarters.innerHTML = `<p>Quarters: $${result.leftQuarter}</p>`;
      drawerOnes.innerHTML = `<p>Ones: $${result.leftOne}</p>`;
      drawerFives.innerHTML = `<p>Fives: $${result.leftFive}</p>`;
      drawerTens.innerHTML = `<p>Tens: $${result.leftTen}</p>`;
      drawerTwenties.innerHTML = `<p>Twenties: $${result.leftTwenty}</p>`;
      drawerHundreds.innerHTML = `<p>Hundreds: $${result.leftHundred}</p>`;

      availableCid = [
          ['PENNY', result.leftPenny],
          ['NICKEL', result.leftNickel],
          ['DIME', result.leftDime],
          ['QUARTER', result.leftQuarter],
          ['ONE', result.leftOne],
          ['FIVE', result.leftFive],
          ['TEN', result.leftTen],
          ['TWENTY', result.leftTwenty],
          ['ONE HUNDRED', result.leftHundred]
      ];
      
      // Change Status
      if (price < parseFloat(cash.value) && difference.toFixed(2) < totalCid.toFixed(2)) { 
      changeStatus.innerHTML = '<p>Status: OPEN</p>';
      } else if (price < parseFloat(cash.value) && difference.toFixed(2) === totalCid.toFixed(2)) {
      changeStatus.innerHTML = '<p>Status: CLOSED</p>';
      }
    }
  }

  // Clear inputed cash
  cash.value = '';
});

To debug, I would add a console.log statement for this result variable and run a few consecutive tests without reloading the page. Then I would watch this variable to see if the numbers being logged make sense as I repeatedly make different change amounts (by varying the amount type into the input and repeatedly clicking purchase but without reloading).

result = checkCoinPattern(availableCid, difference);
    console.log(purchaseBtnCount);    // add
    console.log(result);  // add

I executed No.14’s test.
I input 20, 20, 19.51, 20 consecutively.
It looks right to me…

(console)
1
{ numHundred: 0,
  numTwenty: 0,
  numTen: 0,
  numFive: 0,
  numOne: 0,
  numQuarter: 0,
  numDime: 0,
  numNickel: 0,
  numPenny: 0.01,
  leftHundred: 0,
  leftTwenty: 0,
  leftTen: 0,
  leftFive: 0,
  leftOne: 0,
  leftQuarter: 0,
  leftDime: 0,
  leftNickel: 0,
  leftPenny: 0,
  changeFlg: false }

(display)
Status: INSUFFICIENT_FUNDS

Change in drawer:
Pennies: $0.01
Nickels: $0
Dimes: $0
Quarters: $0
Ones: $0
Fives: $0
Tens: $0
Twenties: $0
Hundreds: $0

On the second time, the result was same of the fires one.

(console)
3
{ numHundred: 0,
  numTwenty: 0,
  numTen: 0,
  numFive: 0,
  numOne: 0,
  numQuarter: 0,
  numDime: 0,
  numNickel: 0,
  numPenny: 0.01,
  leftHundred: 0,
  leftTwenty: 0,
  leftTen: 0,
  leftFive: 0,
  leftOne: 0,
  leftQuarter: 0,
  leftDime: 0,
  leftNickel: 0,
  leftPenny: 0,
  changeFlg: true }

(display)
Status: CLOSED
PENNY: $0.01

Change in drawer:
Pennies: $0
Nickels: $0
Dimes: $0
Quarters: $0
Ones: $0
Fives: $0
Tens: $0
Twenties: $0
Hundreds: $0

(console)
4
{ numHundred: 0,
  numTwenty: 0,
  numTen: 0,
  numFive: 0,
  numOne: 0,
  numQuarter: 0,
  numDime: 0,
  numNickel: 0,
  numPenny: 0,
  leftHundred: 0,
  leftTwenty: 0,
  leftTen: 0,
  leftFive: 0,
  leftOne: 0,
  leftQuarter: 0,
  leftDime: 0,
  leftNickel: 0,
  leftPenny: 0,
  changeFlg: false }

(display)
Status: INSUFFICIENT_FUNDS

Change in drawer:
Pennies: $0
Nickels: $0
Dimes: $0
Quarters: $0
Ones: $0
Fives: $0
Tens: $0
Twenties: $0
Hundreds: $0

try this test:

with these values:

let price = 19.5;
let cid = [
  ['PENNY', 0.05],
  ['NICKEL', 0],
  ['DIME', 0.05],
  ['QUARTER', 0],
  ['ONE', 0],
  ['FIVE', 0],
  ['TEN', 0],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];

Type 19.6 into the cash.
Then click purchase and you will see:

Status: CLOSED
DIME: $0.05
PENNY: $0.05

Then press purchase again with the exact same cash.
Instead of getting INSUFFICIENT_FUNDS, you will see the same result above. (which is incorrect).

Thank you for your answer.
I checked my code with the information you provided and noticed the following mistakes, which I have modified

  1. There is an error in writing the code that I copied and used.
  2. There is an error in the calculation of the decimal point.
  3. The conditions for checking the money in the cash register were incorrect.

It seems to be working correctly since the last time,
However, I still can’t pass the test of No.13, 14, 16, 18,19…

I thought I fixed one test and another test was fixed,
When I fix a different part, the part that was fixed last time fails,
I feel like I’m going to fail…

let price = 19.5;
let cid = [
  ['PENNY', 0.5],
  ['NICKEL', 0],
  ['DIME', 0],
  ['QUARTER', 0],
  ['ONE', 0],
  ['FIVE', 0],
  ['TEN', 0],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];

let cashStock;
let result;
let purchaseBtnCount;
let availableCid = [];

// get HTMl elements
const changeStatus = document.getElementById('change-status');
const changeHundred = document.getElementById('change-hundred');
const changeTwenty = document.getElementById('change-twenty');
const changeTen = document.getElementById('change-ten');
const changeFive = document.getElementById('change-five');
const changeOne = document.getElementById('change-one');
const changeQuarter = document.getElementById('change-quarter');
const changeDime = document.getElementById('change-dime');
const changeNickel = document.getElementById('change-nickel');
const changePenny = document.getElementById('change-penny');

const cash = document.getElementById('cash');
const purchaseBtn = document.getElementById('purchase-btn');
const priceElement = document.getElementById('price');

const drawerPennies = document.getElementById('drawer-pennies');
const drawerNickels = document.getElementById('drawer-nickels');
const drawerDimes = document.getElementById('drawer-dimes');
const drawerQuarters = document.getElementById('drawer-quarters');
const drawerOnes = document.getElementById('drawer-ones');
const drawerFives = document.getElementById('drawer-fives');
const drawerTens = document.getElementById('drawer-tens');
const drawerTwenties = document.getElementById('drawer-twenties');
const drawerHundreds = document.getElementById('drawer-hundreds');

// Display price
priceElement.innerHTML = `<p>Price: $${price}</p>`;

// Display drawer
const penny = cid.find(coin => coin[0] === 'PENNY');
drawerPennies.innerHTML = `<p>Pennies: $${penny[1]}</p>`;
const nickel = cid.find(coin => coin[0] === 'NICKEL');
drawerNickels.innerHTML = `<p>Nickels: $${nickel[1]}</p>`;
const dime = cid.find(coin => coin[0] === 'DIME');
drawerDimes.innerHTML = `<p>Dimes: $${dime[1]}</p>`;
const quarter = cid.find(coin => coin[0] === 'QUARTER');
drawerQuarters.innerHTML = `<p>Quarters: $${quarter[1]}</p>`;
const one = cid.find(coin => coin[0] === 'ONE');
drawerOnes.innerHTML = `<p>Ones: $${one[1]}</p>`;
const five = cid.find(coin => coin[0] === 'FIVE');
drawerFives.innerHTML = `<p>Fives: $${five[1]}</p>`;
const ten = cid.find(coin => coin[0] === 'TEN');
drawerTens.innerHTML = `<p>Tens: $${ten[1]}</p>`;
const tenty = cid.find(coin => coin[0] === 'TWENTY');
drawerTwenties.innerHTML = `<p>Twenties: $${tenty[1]}</p>`;
const hundred = cid.find(coin => coin[0] === 'ONE HUNDRED');
drawerHundreds.innerHTML = `<p>Hundreds: $${hundred[1]}</p>`;

// Reset #change-due
const resetChangeDue = () => {
  changeHundred.innerHTML = '';
  changeTwenty.innerHTML = '';
  changeTen.innerHTML = '';
  changeFive.innerHTML = '';
  changeOne.innerHTML = '';
  changeQuarter.innerHTML = '';
  changeDime.innerHTML = '';
  changeNickel.innerHTML = '';
  changePenny.innerHTML = '';
};

// Check register cash's count
const checkRegister = (availableCid, difference) => {
  const hundredIndex = availableCid.findIndex(coin => coin[0] === 'ONE HUNDRED');
  const twentyIndex = availableCid.findIndex(coin => coin[0] === 'TWENTY');
  const tenIndex = availableCid.findIndex(coin => coin[0] === 'TEN');
  const fiveIndex = availableCid.findIndex(coin => coin[0] === 'FIVE');
  const oneIndex = availableCid.findIndex(coin => coin[0] === 'ONE');
  const quarterIndex = availableCid.findIndex(coin => coin[0] === 'QUARTER');
  const dimeIndex = availableCid.findIndex(coin => coin[0] === 'DIME');
  const nickelIndex = availableCid.findIndex(coin => coin[0] === 'NICKEL');
  const pennyIndex = availableCid.findIndex(coin => coin[0] === 'PENNY');

  // Now you can access the coin name using index 0
  const hundred = availableCid[hundredIndex][1];
  const twenty = availableCid[twentyIndex][1];
  const ten = availableCid[tenIndex][1];
  const five = availableCid[fiveIndex][1];
  const one = availableCid[oneIndex][1];
  const quarter = availableCid[quarterIndex][1];
  const dime = availableCid[dimeIndex][1];
  const nickel = availableCid[nickelIndex][1];
  const penny = availableCid[pennyIndex][1];

  return cashStock = {
    hundred,
    twenty,
    ten,
    five,
    one,
    quarter,
    dime,
    nickel,
    penny
  };
};

// Check coin pattern
const checkCoinPattern = (availableCid, difference) => {
  cashStock = checkRegister(availableCid, difference);

  let numHundred = 0;
  let numTwenty = 0;
  let numTen = 0;
  let numFive = 0;
  let numOne = 0;
  let numQuarter = 0;
  let centNumDime = 0;
  let numDime = 0;
  let centNumNickel = 0;
  let numNickel = 0;
  let centNumPenny = 0;
  let numPenny = 0;
  let leftHundred = cashStock.hundred;
  let leftTwenty = cashStock.twenty;
  let leftTen = cashStock.ten;
  let leftFive = cashStock.five;
  let leftOne = cashStock.one;
  let leftQuarter = cashStock.quarter;
  let leftDime = cashStock.dime;
  let leftNickel = cashStock.nickel;
  let leftPenny = cashStock.penny;
  let changeFlg = false;

  // Calc cash
  if (difference >= 100 && cashStock.hundred >= 100) {
    if (difference <= cashStock.hundred) {
      numHundred = Math.floor(difference / 100) * 100;
    } else {
      numHundred = cashStock.hundred;
    }
      difference = (difference - numHundred).toFixed(2);
      leftHundred = cashStock.hundred - numHundred;
    }

    if (difference >= 20 && cashStock.twenty >= 20) {
      if (difference <= cashStock.twenty) {
        numTwenty = Math.floor(difference / 20) * 20;
      } else {
        numTwenty = cashStock.twenty;
      }
        difference = (difference - numTwenty).toFixed(2);
        leftTwenty = cashStock.twenty - numTwenty; 
    }

    if (difference >= 10 && cashStock.ten >= 10) {
      if (difference <= cashStock.ten) {
        numTen = Math.floor(difference / 10) * 10;
      } else {
        numTen = cashStock.ten;
      }
      difference = (difference - numTen).toFixed(2);
      leftTen = cashStock.ten - numTen;
    }

    if (difference >= 5 && cashStock.five >= 5) {
      if (difference <= cashStock.five) {
        numFive = Math.floor(difference / 5) * 5;
      } else {
        numFive = cashStock.five;
      }
        difference = (difference - numFive).toFixed(2);
        leftFive = cashStock.five - numFive;
      }
      
      if (difference >= 1 && cashStock.one >= 1) {
        if (difference <= cashStock.one) {
            numOne = Math.floor(difference);
        } else {
          numTen = cashStock.one;
        }
          difference = (difference - numOne).toFixed(2);
          leftOne = cashStock.one - numOne;
        }

        if (difference >= 0.25 && cashStock.quarter >= 0.25) {
          if (difference <= cashStock.quarter) {
            numQuarter = Math.floor(difference / 0.25) * 0.25;
          } else {
            numQuarter = cashStock.quarter;
          }
          difference = (difference - numQuarter).toFixed(2);
          leftQuarter = cashStock.quarter - numQuarter;
        }

        if (difference >= 0.1 && cashStock.dime >= 0.1) {
          if (difference <= cashStock.dime) {
            centNumDime = Math.floor((difference * 100) / 10) * 10;
            numDime = centNumDime / 100;
          } else {
              numDime = cashStock.dime;
          }
          difference = (difference*100 - centNumDime) / 100;
          leftDime = (cashStock.dime - numDime).toFixed(2);
        }

        if (difference >= 0.05 && cashStock.nickel !== 0.05) {
          if (difference <= cashStock.nickel) {
              centNumNickel = Math.floor((difference * 100) / 5) * 5;
              numNickel = centNumNickel/100;
          } else {
            numNickel = cashStock.nickel;
          }
          difference = (difference*100 - centNumNickel) / 100;
          leftNickel = (cashStock.nickel - numNickel).toFixed(2);
        }

        if (difference >= 0.01 && cashStock.nickel !== 0.01) {
          if (difference <= cashStock.penny) {
            centNumPenny = Math.floor((difference * 100) / 1) * 1;
            numPenny = centNumPenny/100;
          } else {
            numPenny = cashStock.penny;
          }
          difference = (difference * 100 - centNumPenny) / 100;
          leftPenny = (cashStock.penny - numPenny).toFixed(2);
        }

        if (difference >= 0.001) {
          changeFlg = false;
        } else {
          changeFlg = true;
        }
        
        return result =
       {
        numHundred,
        numTwenty,
        numTen,
        numFive,
        numOne,
        numQuarter,
        numDime,
        numNickel,
        numPenny,
        leftHundred,
        leftTwenty,
        leftTen,
        leftFive,
        leftOne,
        leftQuarter,
        leftDime,
        leftNickel,
        leftPenny,
        changeFlg
      };

};

window.onload = function() {
  purchaseBtnCount = 0;
};

purchaseBtn.addEventListener('click', () => {
  resetChangeDue();
  // Check inputted cash
  // Not enough cash
  if (parseFloat(cash.value) < price) {
    alert('Customer does not have enough money to purchase the item');
  }
  // No cash
  if (parseFloat(cash.value) === price) {
    changeStatus.innerHTML = '<p>No change due - customer paid with exact cash</p>';
  }

  // Calcurate cash
  if (parseFloat(cash.value) > price) {
    purchaseBtnCount++;

    if (purchaseBtnCount > 1) {
      availableCid = availableCid.slice();
    } else {
      availableCid = cid.slice();
    }

    // Calcurate register total
    let totalCid = parseFloat(availableCid.reduce((total, coin) => total + coin[1], 0));

    // Calcurate register total
    let tempDifference = parseFloat(cash.value) - price;
    let difference = tempDifference.toFixed(2)

    // Check lack of change
    if (difference > totalCid) {
      changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
    } else {
      result = checkCoinPattern(availableCid, difference);

      // Check coin pattern
      if (!result.changeFlg) {
        // Enable to return change
        changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
      // Return changes
      } else {
        // Display #change-due
        result.numHundred !== 0 ? 
        changeHundred.innerHTML = `<p>ONE HUNDRED: $${result.numHundred}</p>` : '';

        result.numTwenty !== 0 ? 
          changeTwenty.innerHTML = `<p>TWENTY: $${result.numTwenty}</p>` : '';

        result.numTen !== 0 ? 
          changeTen.innerHTML = `<p>TEN: $${result.numTen}</p>` : '';

        result.numFive !== 0 ? 
          changeFive.innerHTML = `<p>FIVE: $${result.numFive}</p>` : '';
      
        result.numOne !== 0 ? 
          changeOne.innerHTML = `<p>ONE: $${result.numOne}</p>` : '';
      
        result.numQuarter !== 0 ? 
          changeQuarter.innerHTML = `<p>QUARTER: $${result.numQuarter}</p>` : '';
      
        result.numDime !== 0 ? 
          changeDime.innerHTML = `<p>DIME: $${result.numDime}</p>` : '';
      
        result.numNickel !== 0 ? 
          changeNickel.innerHTML = `<p>NICKEL: $${result.numNickel}</p>` : '';
      
        result.numPenny !== 0 ? 
          changePenny.innerHTML = `<p>PENNY: $${result.numPenny}</p>` : '';

        // Update drawer
        drawerPennies.innerHTML = `<p>Pennies: $${result.leftPenny}</p>`;
        drawerNickels.innerHTML = `<p>Nickels: $${result.leftNickel}</p>`;
        drawerDimes.innerHTML = `<p>Dimes: $${result.leftDime}</p>`;
        drawerQuarters.innerHTML = `<p>Quarters: $${result.leftQuarter}</p>`;
        drawerOnes.innerHTML = `<p>Ones: $${result.leftOne}</p>`;
        drawerFives.innerHTML = `<p>Fives: $${result.leftFive}</p>`;
        drawerTens.innerHTML = `<p>Tens: $${result.leftTen}</p>`;
        drawerTwenties.innerHTML = `<p>Twenties: $${result.leftTwenty}</p>`;
        drawerHundreds.innerHTML = `<p>Hundreds: $${result.leftHundred}</p>`;

        availableCid = [
            ['PENNY', result.leftPenny],
            ['NICKEL', result.leftNickel],
            ['DIME', result.leftDime],
            ['QUARTER', result.leftQuarter],
            ['ONE', result.leftOne],
            ['FIVE', result.leftFive],
            ['TEN', result.leftTen],
            ['TWENTY', result.leftTwenty],
            ['ONE HUNDRED', result.leftHundred]
        ];

        // Change Status
        if (price < parseFloat(cash.value) && totalCid.toFixed(2) - difference > 0) { 
        changeStatus.innerHTML = '<p>Status: OPEN</p>';
        } else if (price < parseFloat(cash.value) && difference === totalCid.toFixed(2)) {
        changeStatus.innerHTML = '<p>Status: CLOSED</p>';
        }
      }
    }
  }

  // Clear inputed cash
  cash.value = '';
});

your code doesn’t work though?
I wouldn’t try running the tests until the code is well-tested by you.
for eg. here’s what I used in the js file instead of the current cid:

let price = 19.5;
let cid = [
  ['PENNY', 0.05],
  ['NICKEL', 0],
  ['DIME', 0.1],
  ['QUARTER', 0],
  ['ONE', 2],
  ['FIVE', 0],
  ['TEN', 0],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];

And I typed $20.53 which gave me the expected change,
then I typed 21 (which gave insufficient funds as expected)
then I typed 20.62 which should have given me a status of closed but gave me a status of INSUFFICIENT_FUNDS

Try to add more logs to your code and do more testing to see where the failures are happening.

Many times how the code handles floats may be at fault or it could be a logical issue.
To avoid having to deal with floating point arithmetic all the time, we usually recommend that people transfer the dollar amounts into cents at the start and then just do whole number arithmetic till you need to display the change at which point you transfer back to dollar amounts and floating point.

I changed code to convert to cents to avoid calculation of decimal points.

However, at this point, an error has already occurred, and everything after No. 14 is failed.

let price = 3.26;
let cid = [
  ['PENNY', 1.01],
  ['NICKEL', 2.05],
  ['DIME', 3.1],
  ['QUARTER', 4.25],
  ['ONE', 90],
  ['FIVE', 55],
  ['TEN', 20],
  ['TWENTY', 60],
  ['ONE HUNDRED', 100]
];

// To avoid decimal calculations, convert to cents.
let centCid = cid.map(([coin, amount]) => [coin, amount * 100]);

let totalCid = 0;
let cashStock;
let result;
let purchaseBtnCount;
let availableCid = [];

// get HTMl elements
const changeStatus = document.getElementById('change-status');
const changeHundred = document.getElementById('change-hundred');
const changeTwenty = document.getElementById('change-twenty');
const changeTen = document.getElementById('change-ten');
const changeFive = document.getElementById('change-five');
const changeOne = document.getElementById('change-one');
const changeQuarter = document.getElementById('change-quarter');
const changeDime = document.getElementById('change-dime');
const changeNickel = document.getElementById('change-nickel');
const changePenny = document.getElementById('change-penny');

const cash = document.getElementById('cash');
const purchaseBtn = document.getElementById('purchase-btn');
const priceElement = document.getElementById('price');

const drawerPennies = document.getElementById('drawer-pennies');
const drawerNickels = document.getElementById('drawer-nickels');
const drawerDimes = document.getElementById('drawer-dimes');
const drawerQuarters = document.getElementById('drawer-quarters');
const drawerOnes = document.getElementById('drawer-ones');
const drawerFives = document.getElementById('drawer-fives');
const drawerTens = document.getElementById('drawer-tens');
const drawerTwenties = document.getElementById('drawer-twenties');
const drawerHundreds = document.getElementById('drawer-hundreds');

// Display price
priceElement.innerHTML = `<p>Price: $${price}</p>`;

// Display drawer
const penny = cid.find(coin => coin[0] === 'PENNY');
drawerPennies.innerHTML = `<p>Pennies: $${penny[1]}</p>`;
const nickel = cid.find(coin => coin[0] === 'NICKEL');
drawerNickels.innerHTML = `<p>Nickels: $${nickel[1]}</p>`;
const dime = cid.find(coin => coin[0] === 'DIME');
drawerDimes.innerHTML = `<p>Dimes: $${dime[1]}</p>`;
const quarter = cid.find(coin => coin[0] === 'QUARTER');
drawerQuarters.innerHTML = `<p>Quarters: $${quarter[1]}</p>`;
const one = cid.find(coin => coin[0] === 'ONE');
drawerOnes.innerHTML = `<p>Ones: $${one[1]}</p>`;
const five = cid.find(coin => coin[0] === 'FIVE');
drawerFives.innerHTML = `<p>Fives: $${five[1]}</p>`;
const ten = cid.find(coin => coin[0] === 'TEN');
drawerTens.innerHTML = `<p>Tens: $${ten[1]}</p>`;
const tenty = cid.find(coin => coin[0] === 'TWENTY');
drawerTwenties.innerHTML = `<p>Twenties: $${tenty[1]}</p>`;
const hundred = cid.find(coin => coin[0] === 'ONE HUNDRED');
drawerHundreds.innerHTML = `<p>Hundreds: $${hundred[1]}</p>`;

// Reset #change-due
const resetChangeDue = () => {
  changeHundred.innerHTML = '';
  changeTwenty.innerHTML = '';
  changeTen.innerHTML = '';
  changeFive.innerHTML = '';
  changeOne.innerHTML = '';
  changeQuarter.innerHTML = '';
  changeDime.innerHTML = '';
  changeNickel.innerHTML = '';
  changePenny.innerHTML = '';
};

// Check register cash's count
const checkRegister = (availableCid) => {
  const hundredIndex = availableCid.findIndex(coin => coin[0] === 'ONE HUNDRED');
  const twentyIndex = availableCid.findIndex(coin => coin[0] === 'TWENTY');
  const tenIndex = availableCid.findIndex(coin => coin[0] === 'TEN');
  const fiveIndex = availableCid.findIndex(coin => coin[0] === 'FIVE');
  const oneIndex = availableCid.findIndex(coin => coin[0] === 'ONE');
  const quarterIndex = availableCid.findIndex(coin => coin[0] === 'QUARTER');
  const dimeIndex = availableCid.findIndex(coin => coin[0] === 'DIME');
  const nickelIndex = availableCid.findIndex(coin => coin[0] === 'NICKEL');
  const pennyIndex = availableCid.findIndex(coin => coin[0] === 'PENNY');

  // Now you can access the coin name using index 0
  const hundred = availableCid[hundredIndex][1];
  const twenty = availableCid[twentyIndex][1];
  const ten = availableCid[tenIndex][1];
  const five = availableCid[fiveIndex][1];
  const one = availableCid[oneIndex][1];
  const quarter = availableCid[quarterIndex][1];
  const dime = availableCid[dimeIndex][1];
  const nickel = availableCid[nickelIndex][1];
  const penny = availableCid[pennyIndex][1];

  return cashStock = {
    hundred,
    twenty,
    ten,
    five,
    one,
    quarter,
    dime,
    nickel,
    penny
  };
};

// Check coin pattern
const checkCoinPattern = (availableCid, difference) => {
  cashStock = checkRegister(availableCid);

  let numHundred = 0;
  let numTwenty = 0;
  let numTen = 0;
  let numFive = 0;
  let numOne = 0;
  let numQuarter = 0;
  let numDime = 0;
  let numNickel = 0;
  let numPenny = 0;
  let leftHundred = cashStock.hundred;
  let leftTwenty = cashStock.twenty;
  let leftTen = cashStock.ten;
  let leftFive = cashStock.five;
  let leftOne = cashStock.one;
  let leftQuarter = cashStock.quarter;
  let leftDime = cashStock.dime;
  let leftNickel = cashStock.nickel;
  let leftPenny = cashStock.penny;
  let changeFlg = false;

  // Calc cash
  if (difference >= 10000 && cashStock.hundred >= 10000) {
    if (difference <= cashStock.hundred) {
      numHundred = Math.floor(difference / 10000) * 10000;
    } else {
      numHundred = cashStock.hundred;
    }
      difference = difference - numHundred;
      leftHundred = cashStock.hundred - numHundred;
    }

    if (difference >= 2000 && cashStock.twenty >= 2000) {
      if (difference <= cashStock.twenty) {
        numTwenty = Math.floor(difference / 2000) * 2000;
      } else {
        numTwenty = cashStock.twenty;
      }
        difference = difference - numTwenty;
        leftTwenty = cashStock.twenty - numTwenty; 
    }

    if (difference >= 1000 && cashStock.ten >= 1000) {
      if (difference <= cashStock.ten) {
        numTen = Math.floor(difference / 1000) * 1000;
      } else {
        numTen = cashStock.ten;
      }
      difference = difference - numTen;
      leftTen = cashStock.ten - numTen;
    }

    if (difference >= 500 && cashStock.five >= 500) {
      if (difference <= cashStock.five) {
        numFive = Math.floor(difference / 500) * 500;
      } else {
        numFive = cashStock.five;
      }
        difference = difference - numFive;
        leftFive = cashStock.five - numFive;
      }
      
      if (difference >= 100 && cashStock.one >= 100) {
        if (difference <= cashStock.one) {
            numOne = Math.floor(difference / 100) * 100;
        } else {
          numTen = cashStock.one ;
        }
          difference = difference - numOne;
          leftOne = cashStock.one - numOne;
        }

        if (difference >= 25 && cashStock.quarter >= 25) {
          if (difference <= cashStock.quarter) {
            numQuarter = Math.floor(difference / 25) * 25;
          } else {
            numQuarter = cashStock.quarter;
          }
          difference = difference - numQuarter;
          leftQuarter = cashStock.quarter - numQuarter;
        }

        if (difference >= 10 && cashStock.dime >= 10) {
          if (difference <= cashStock.dime) {
            numDime = Math.floor(difference / 10) * 10;
          } else {
              numDime = cashStock.dime;
          }
          difference = difference - numDime;
          leftDime = cashStock.dime - numDime;
        }

        if (difference >= 5 && cashStock.nickel >= 5) {
          if (difference <= cashStock.nickel) {
              numNickel = Math.floor(difference / 5) * 5;
          } else {
            numNickel = cashStock.nickel;
          }
          difference = difference - numNickel;
          leftNickel = cashStock.nickel - numNickel;
        }

        if (difference >= 1 && cashStock.penny >= 1) {
          if (difference <= cashStock.penny) {
            numPenny = difference;
          } else {
            numPenny = cashStock.penny;
          }
          difference = difference - numPenny;
          leftPenny = cashStock.penny - numPenny;
        }

        console.log("計算結果",difference);
        
        if (difference > 0) {
          changeFlg = false;
        } else {
          changeFlg = true;
        }

        return result =
       {
        numHundred,
        numTwenty,
        numTen,
        numFive,
        numOne,
        numQuarter,
        numDime,
        numNickel,
        numPenny,
        leftHundred,
        leftTwenty,
        leftTen,
        leftFive,
        leftOne,
        leftQuarter,
        leftDime,
        leftNickel,
        leftPenny,
        changeFlg
      };

};

window.onload = function() {
  purchaseBtnCount = 0;
};

purchaseBtn.addEventListener('click', () => {
  resetChangeDue();
  const sentCash = cash.value * 100;
  const sentPrice = price * 100;
  console.log(sentCash);
  console.log(sentPrice);

  // Check inputted cash
  // Not enough cash
  if (sentCash < sentPrice) {
    alert('Customer does not have enough money to purchase the item');
    resetChangeDue();
  }
  // No cash
  if (sentCash === sentPrice) {
    changeStatus.innerHTML = '<p>No change due - customer paid with exact cash</p>';
  }

  // Calcurate cash
  if (sentCash > sentPrice) {
    purchaseBtnCount++;

    if (purchaseBtnCount > 1) {
      availableCid = availableCid.slice();
      // Calcurate register total

    } else {
      availableCid = centCid.slice();
      // Calcurate register total

    }
    
    totalCid = parseFloat(availableCid.reduce((total, coin) => total + coin[1], 0));
      //console.log("レジ(¢)",availableCid);
      console.log(centCid);

    // Calcurate register total
    //let difference =  Math.floor((cash - price).toFixed(2) * 100) ;
    let difference =  sentCash - sentPrice;
    console.log(difference);


    console.log("差額(¢)",difference);

    // Check lack of change
    if (difference > totalCid) {
      changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
    } else {
      result = checkCoinPattern(availableCid, difference);

      // Check coin pattern
      if (!result.changeFlg) {
        // Enable to return change
        changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
      // Return changes
      } else {
        // Display #change-due
        result.numHundred !== 0 ? 
        changeHundred.innerHTML = `<p>ONE HUNDRED: $${result.numHundred / 100}</p>` : '';

        result.numTwenty !== 0 ? 
          changeTwenty.innerHTML = `<p>TWENTY: $${result.numTwenty / 100}</p>` : '';

        result.numTen !== 0 ? 
          changeTen.innerHTML = `<p>TEN: $${result.numTen / 100}</p>` : '';

        result.numFive !== 0 ? 
          changeFive.innerHTML = `<p>FIVE: $${result.numFive / 100}</p>` : '';
      
        result.numOne !== 0 ? 
          changeOne.innerHTML = `<p>ONE: $${result.numOne / 100}</p>` : '';
      
        result.numQuarter !== 0 ? 
          changeQuarter.innerHTML = `<p>QUARTER: $${result.numQuarter / 100}</p>` : '';
      
        result.numDime !== 0 ? 
          changeDime.innerHTML = `<p>DIME: $${result.numDime / 100}</p>` : '';
      
        result.numNickel !== 0 ? 
          changeNickel.innerHTML = `<p>NICKEL: $${result.numNickel / 100}</p>` : '';
      
        result.numPenny !== 0 ? 
          changePenny.innerHTML = `<p>PENNY: $${result.numPenny / 100}</p>` : '';

        // Update drawer
        drawerPennies.innerHTML = `<p>Pennies: $${result.leftPenny / 100}</p>`;

        drawerNickels.innerHTML = `<p>Nickels: $${result.leftNickel / 100}</p>`;

        drawerDimes.innerHTML = `<p>Dimes: $${result.leftDime / 100}</p>`;

        drawerQuarters.innerHTML = `<p>Quarters: $${result.leftQuarter / 100}</p>`;

        drawerOnes.innerHTML = `<p>Ones: $${result.leftOne / 100}</p>`;

        drawerFives.innerHTML = `<p>Fives: $${result.leftFive / 100}</p>`;

        drawerTens.innerHTML = `<p>Tens: $${result.leftTen / 100}</p>`;

        drawerTwenties.innerHTML = `<p>Twenties: $${result.leftTwenty / 100}</p>`;

        drawerHundreds.innerHTML = `<p>Hundreds: $${result.leftHundred / 100}</p>`;

        availableCid = [
            ['PENNY', result.leftPenny],
            ['NICKEL', result.leftNickel],
            ['DIME', result.leftDime],
            ['QUARTER', result.leftQuarter],
            ['ONE', result.leftOne],
            ['FIVE', result.leftFive],
            ['TEN', result.leftTen],
            ['TWENTY', result.leftTwenty],
            ['ONE HUNDRED', result.leftHundred]
        ];

        // Change Status
        if (price < parseFloat(cash.value) && totalCid - difference > 0) { 
        changeStatus.innerHTML = '<p>Status: OPEN</p>';
        } else if (price < parseFloat(cash.value) && difference === totalCid) {
        changeStatus.innerHTML = '<p>Status: CLOSED</p>';
        }
      }
    }
  }

  // Clear inputed cash
  cash.value = '';
});

Did you try to test your code yourself and figure out the issue?

What did you attempt and what are your conclusions?

I have been running the test in the basic way of checking the calculation process by displaying it in the console.
But I’m not sure how to identify the potential reason why the test does not pass.

I put the value of cid in the test case, or some other value,

  1. The case of OPEN to return the change
  2. The case of COLSE to make the balance in the cash register zero
  3. The case of not enough change and INSUFFICIENT_FUNDS was tested.
  • In those cases, I confirmed the cases in which the results are inaccurate,
    I found that the modification of the copied code was incomplete.
    → Fixes.
  • I found that not changing the price and cid values to cents before the calculationn caused a decimal point error when repeated calculations were performed.
  • →Converted price and cid values to cents before calculation to avoid calculation with a decimal point.

The cause of the discovered incorrect calculations has now been identified and the calculation results are correct.
Also, the values match the results of the test case.

But still the test does not pass!

let price = 3.26;
let cid = [
  ['PENNY', 0.12],
  ['NICKEL', 0.05],
  ['DIME', 1.1],
  ['QUARTER', 1.25],
  ['ONE', 9],
  ['FIVE', 5],
  ['TEN', 0],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];

// To avoid decimal calculations, convert to cents.
let centCid = cid.map(([coin, amount]) => [coin, parseInt(amount * 100)]);
console.log(centCid);

let totalCid = 0;
let cashStock;
let result;
let purchaseBtnCount;
let availableCid = [];

// get HTMl elements
const changeStatus = document.getElementById('change-status');
const changeHundred = document.getElementById('change-hundred');
const changeTwenty = document.getElementById('change-twenty');
const changeTen = document.getElementById('change-ten');
const changeFive = document.getElementById('change-five');
const changeOne = document.getElementById('change-one');
const changeQuarter = document.getElementById('change-quarter');
const changeDime = document.getElementById('change-dime');
const changeNickel = document.getElementById('change-nickel');
const changePenny = document.getElementById('change-penny');

const cash = document.getElementById('cash');
const purchaseBtn = document.getElementById('purchase-btn');
const priceElement = document.getElementById('price');

const drawerPennies = document.getElementById('drawer-pennies');
const drawerNickels = document.getElementById('drawer-nickels');
const drawerDimes = document.getElementById('drawer-dimes');
const drawerQuarters = document.getElementById('drawer-quarters');
const drawerOnes = document.getElementById('drawer-ones');
const drawerFives = document.getElementById('drawer-fives');
const drawerTens = document.getElementById('drawer-tens');
const drawerTwenties = document.getElementById('drawer-twenties');
const drawerHundreds = document.getElementById('drawer-hundreds');

// Display price
priceElement.innerHTML = `<p>Price: $${price}</p>`;

// Display drawer
const penny = cid.find(coin => coin[0] === 'PENNY');
drawerPennies.innerHTML = `<p>Pennies: $${penny[1]}</p>`;
const nickel = cid.find(coin => coin[0] === 'NICKEL');
drawerNickels.innerHTML = `<p>Nickels: $${nickel[1]}</p>`;
const dime = cid.find(coin => coin[0] === 'DIME');
drawerDimes.innerHTML = `<p>Dimes: $${dime[1]}</p>`;
const quarter = cid.find(coin => coin[0] === 'QUARTER');
drawerQuarters.innerHTML = `<p>Quarters: $${quarter[1]}</p>`;
const one = cid.find(coin => coin[0] === 'ONE');
drawerOnes.innerHTML = `<p>Ones: $${one[1]}</p>`;
const five = cid.find(coin => coin[0] === 'FIVE');
drawerFives.innerHTML = `<p>Fives: $${five[1]}</p>`;
const ten = cid.find(coin => coin[0] === 'TEN');
drawerTens.innerHTML = `<p>Tens: $${ten[1]}</p>`;
const tenty = cid.find(coin => coin[0] === 'TWENTY');
drawerTwenties.innerHTML = `<p>Twenties: $${tenty[1]}</p>`;
const hundred = cid.find(coin => coin[0] === 'ONE HUNDRED');
drawerHundreds.innerHTML = `<p>Hundreds: $${hundred[1]}</p>`;

// Reset #change-due
const resetChangeDue = () => {
  changeHundred.innerHTML = '';
  changeTwenty.innerHTML = '';
  changeTen.innerHTML = '';
  changeFive.innerHTML = '';
  changeOne.innerHTML = '';
  changeQuarter.innerHTML = '';
  changeDime.innerHTML = '';
  changeNickel.innerHTML = '';
  changePenny.innerHTML = '';
};

// Check register cash's count
const checkRegister = (availableCid) => {
  const hundredIndex = availableCid.findIndex(coin => coin[0] === 'ONE HUNDRED');
  const twentyIndex = availableCid.findIndex(coin => coin[0] === 'TWENTY');
  const tenIndex = availableCid.findIndex(coin => coin[0] === 'TEN');
  const fiveIndex = availableCid.findIndex(coin => coin[0] === 'FIVE');
  const oneIndex = availableCid.findIndex(coin => coin[0] === 'ONE');
  const quarterIndex = availableCid.findIndex(coin => coin[0] === 'QUARTER');
  const dimeIndex = availableCid.findIndex(coin => coin[0] === 'DIME');
  const nickelIndex = availableCid.findIndex(coin => coin[0] === 'NICKEL');
  const pennyIndex = availableCid.findIndex(coin => coin[0] === 'PENNY');

  // Now you can access the coin name using index 0
  const hundred = availableCid[hundredIndex][1];
  const twenty = availableCid[twentyIndex][1];
  const ten = availableCid[tenIndex][1];
  const five = availableCid[fiveIndex][1];
  const one = availableCid[oneIndex][1];
  const quarter = availableCid[quarterIndex][1];
  const dime = availableCid[dimeIndex][1];
  const nickel = availableCid[nickelIndex][1];
  const penny = availableCid[pennyIndex][1];

  return cashStock = {
    hundred,
    twenty,
    ten,
    five,
    one,
    quarter,
    dime,
    nickel,
    penny
  };
};

// Check coin pattern
const checkCoinPattern = (availableCid, difference) => {
  cashStock = checkRegister(availableCid);

  let numHundred = 0;
  let numTwenty = 0;
  let numTen = 0;
  let numFive = 0;
  let numOne = 0;
  let numQuarter = 0;
  let numDime = 0;
  let numNickel = 0;
  let numPenny = 0;
  let leftHundred = cashStock.hundred;
  let leftTwenty = cashStock.twenty;
  let leftTen = cashStock.ten;
  let leftFive = cashStock.five;
  let leftOne = cashStock.one;
  let leftQuarter = cashStock.quarter;
  let leftDime = cashStock.dime;
  let leftNickel = cashStock.nickel;
  let leftPenny = cashStock.penny;
  let changeFlg = false;

  // Calc cash
  if (difference >= 10000 && cashStock.hundred >= 10000) {
    if (difference <= cashStock.hundred) {
      numHundred = Math.floor(difference / 10000) * 10000;
    } else {
      numHundred = cashStock.hundred;
    }
      difference = difference - numHundred;
      leftHundred = cashStock.hundred - numHundred;
    }

    if (difference >= 2000 && cashStock.twenty >= 2000) {
      if (difference <= cashStock.twenty) {
        numTwenty = Math.floor(difference / 2000) * 2000;
      } else {
        numTwenty = cashStock.twenty;
      }
        difference = difference - numTwenty;
        leftTwenty = cashStock.twenty - numTwenty; 
    }

    if (difference >= 1000 && cashStock.ten >= 1000) {
      if (difference <= cashStock.ten) {
        numTen = Math.floor(difference / 1000) * 1000;
      } else {
        numTen = cashStock.ten;
      }
      difference = difference - numTen;
      leftTen = cashStock.ten - numTen;
    }

    if (difference >= 500 && cashStock.five >= 500) {
      if (difference <= cashStock.five) {
        numFive = Math.floor(difference / 500) * 500;
      } else {
        numFive = cashStock.five;
      }
        difference = difference - numFive;
        leftFive = cashStock.five - numFive;
      }
      
      if (difference >= 100 && cashStock.one >= 100) {
        if (difference <= cashStock.one) {
            numOne = Math.floor(difference / 100) * 100;
        } else {
          numOne = cashStock.one ;
        }
          difference = difference - numOne;
          leftOne = cashStock.one - numOne;
        }

        if (difference >= 25 && cashStock.quarter >= 25) {
          if (difference <= cashStock.quarter) {
            numQuarter = Math.floor(difference / 25) * 25;
          } else {
            numQuarter = cashStock.quarter;
          }
          difference = difference - numQuarter;
          leftQuarter = cashStock.quarter - numQuarter;
        }

        if (difference >= 10 && cashStock.dime >= 10) {
          if (difference <= cashStock.dime) {
            numDime = Math.floor(difference / 10) * 10;
          } else {
              numDime = cashStock.dime;
          }
          difference = difference - numDime;
          leftDime = cashStock.dime - numDime;
        }

        if (difference >= 5 && cashStock.nickel >= 5) {
          if (difference <= cashStock.nickel) {
              numNickel = Math.floor(difference / 5) * 5;
          } else {
            numNickel = cashStock.nickel;
          }
          difference = difference - numNickel;
          leftNickel = cashStock.nickel - numNickel
        }

        if (difference >= 1 && cashStock.penny >= 1) {
          if (difference <= cashStock.penny) {
            numPenny = difference;
          } else {
            numPenny = cashStock.penny;
          }
          difference = difference - numPenny;
          leftPenny = cashStock.penny - numPenny;
        }

        console.log("計算結果",difference);
        
        if (difference > 0) {
          changeFlg = false;
        } else {
          changeFlg = true;
        }

        return result =
       {
        numHundred,
        numTwenty,
        numTen,
        numFive,
        numOne,
        numQuarter,
        numDime,
        numNickel,
        numPenny,
        leftHundred,
        leftTwenty,
        leftTen,
        leftFive,
        leftOne,
        leftQuarter,
        leftDime,
        leftNickel,
        leftPenny,
        changeFlg
      };

};

window.onload = function() {
  purchaseBtnCount = 0;
};

purchaseBtn.addEventListener('click', () => {
  resetChangeDue();
  const sentCash = parseInt(cash.value * 100);
  const sentPrice = parseInt(price * 100);
  console.log(sentCash);
  console.log(sentPrice);

  // Check inputted cash
  // Not enough cash
  if (sentCash < sentPrice) {
    alert('Customer does not have enough money to purchase the item');
  }
  // No cash
  if (sentCash === sentPrice) {
    changeStatus.innerHTML = '<p>No change due - customer paid with exact cash</p>';
  }

  // Calcurate cash
  if (sentCash > sentPrice) {
    purchaseBtnCount++;

    if (purchaseBtnCount > 1) {
      availableCid = availableCid.slice();
      // Calcurate register total

    } else {
      availableCid = centCid.slice();
      // Calcurate register total

    }
    
    totalCid = parseFloat(availableCid.reduce((total, coin) => total + coin[1], 0));
      //console.log("レジ(¢)",availableCid);
      console.log(centCid);

    // Calcurate register total
    //let difference =  Math.floor((cash - price).toFixed(2) * 100) ;
    let difference =  sentCash - sentPrice;

    console.log("差額(¢)",difference);

    // Check lack of change
    if (difference > totalCid) {
      changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
              console.log(difference , totalCid);
    } else {
      result = checkCoinPattern(availableCid, difference);

      // Check coin pattern
      if (!result.changeFlg) {
        // Enable to return change
        changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
      // Return changes
      } else {
        // Display #change-due
        result.numHundred >= 10000 ? 
        changeHundred.innerHTML = `<p>ONE HUNDRED: $${result.numHundred / 100}</p>` : '';

        result.numTwenty >= 2000 ? 
          changeTwenty.innerHTML = `<p>TWENTY: $${result.numTwenty / 100}</p>` : '';

        result.numTen >= 1000 ? 
          changeTen.innerHTML = `<p>TEN: $${result.numTen / 100}</p>` : '';

        result.numFive >= 500 ? 
          changeFive.innerHTML = `<p>FIVE: $${result.numFive / 100}</p>` : '';
      
        result.numOne >= 100 ? 
          changeOne.innerHTML = `<p>ONE: $${result.numOne / 100}</p>` : '';
      
        result.numQuarter >= 25 ? 
          changeQuarter.innerHTML = `<p>QUARTER: $${result.numQuarter / 100}</p>` : '';
      
        result.numDime >= 10 ? 
          changeDime.innerHTML = `<p>DIME: $${result.numDime / 100}</p>` : '';
      
        result.numNickel >= 5 ? 
          changeNickel.innerHTML = `<p>NICKEL: $${result.numNickel / 100}</p>` : '';
      
        result.numPenny >= 1 ? 
          changePenny.innerHTML = `<p>PENNY: $${result.numPenny / 100}</p>` : '';

        // Update drawer
        drawerPennies.innerHTML = `<p>Pennies: $${result.leftPenny / 100}</p>`;

        drawerNickels.innerHTML = `<p>Nickels: $${result.leftNickel / 100}</p>`;

        drawerDimes.innerHTML = `<p>Dimes: $${result.leftDime / 100}</p>`;

        drawerQuarters.innerHTML = `<p>Quarters: $${result.leftQuarter / 100}</p>`;

        drawerOnes.innerHTML = `<p>Ones: $${result.leftOne / 100}</p>`;

        drawerFives.innerHTML = `<p>Fives: $${result.leftFive / 100}</p>`;

        drawerTens.innerHTML = `<p>Tens: $${result.leftTen / 100}</p>`;

        drawerTwenties.innerHTML = `<p>Twenties: $${result.leftTwenty / 100}</p>`;

        drawerHundreds.innerHTML = `<p>Hundreds: $${result.leftHundred / 100}</p>`;

        availableCid = [
            ['PENNY', result.leftPenny],
            ['NICKEL', result.leftNickel],
            ['DIME', result.leftDime],
            ['QUARTER', result.leftQuarter],
            ['ONE', result.leftOne],
            ['FIVE', result.leftFive],
            ['TEN', result.leftTen],
            ['TWENTY', result.leftTwenty],
            ['ONE HUNDRED', result.leftHundred]
        ];

        // Change Status
        if (sentPrice < sentCash && totalCid - difference > 0) { 
        changeStatus.innerHTML = '<p>Status: OPEN</p>';
        } else if (sentPrice < sentCash && difference === totalCid) {
        changeStatus.innerHTML = '<p>Status: CLOSED</p>';
        }
      }
    }
  }
  // Clear inputed cash
  cash.value = '';
});

my question is, when you found that the test did not pass, what else did you attempt in order to debug your code?

(please don’t speak in general, give details like the exact test case you attempted, how it was attempted, the logs you collected for it, and your analysis of the logs)

A post was split to a new topic: Cash register help

I checked by doing the following.

<script src="https://cdnjs.cloudflare.com/ajax/libs/decimal.js/10.4.2/decimal.min.js"></script>
let centCid = cid.map(([coin, amount]) => {
  let decimalAmount = new Decimal(amount);
  let decimalCid = decimalAmount.mul(100);
  return [coin, decimalCid.toNumber()];
});
console.log(centCid);

Check1. The cid, price, and cash are multiplied by 100, and are displayed on the console to confirm that there is no error before processing the calculation.

No problem

Check2.
The amount of change, the cashier’s total, the return of change, and the remaining cashier’s money were checked as they were displayed on the console.

cid = [ [‘PENNY’, 1.01], [‘NICKEL’, 205], [‘DIME’, 3.10], [‘QUARTER’, 4.25], [‘ONE’, 90], [‘FIVE’, 500], [‘TEN’, 20], [‘TWENTY’, 60], [‘ONE HUNDRED’, 100] ];
price = 3.26
The following cases were run consecutively

  1. cach = 100 >>> No problems with calculation processing and Status.
  2. cach = 100 >>> No problems with calculation processing and Status.
  3. cach = 2.13 >>> No problems. (The alart is displayed.)
  4. cach = 100 >>> No problems with calculation processing and Status.
  5. cach = 150 >>> No problems with Status. (calculation processing wasn’t executed.)
  6. cach = 136.92 >>> No problems with calculation processing and Status.
  7. cach = 6.53 >>> No problems with calculation processing and Status.

Executing “Run the test” with this value of cid, No.13-19 failed.

Check3.
The amount of change, the cashier’s total, the return of change, and the remaining cashier’s money were checked as they were displayed on the console.

cid = [ [‘PENNY’, 0.5], [‘NICKEL’, 0], [‘DIME’, 0], [‘QUARTER’, 0], [‘ONE’, 0], [‘FIVE’, 0], [‘TEN’, 0], [‘TWENTY’, 0], [‘ONE HUNDRED’, 0] ];
price = 19.6
The following cases were run consecutively

  1. cach = 20 >>> No problems with calculation processing and Status.

Executing “Run the test” with this value of cid, No.11, 12, 13, 18, 19 failed.
(Just by changing the value of cid, Nos. 14-17 succeed and Nos. 11-12 fail anew…)

Check4.
The amount of change, the cashier’s total, the return of change, and the remaining cashier’s money were checked as they were displayed on the console.

cid = [ [‘PENNY’, 0.01], [‘NICKEL’, 0], [‘DIME’, 0], [‘QUARTER’, 0], [‘ONE’, 0], [‘FIVE’, 0], [‘TEN’, 0], [‘TWENTY’, 0], [‘ONE HUNDRED’, 0] ];
price = 19.6
The following cases were run consecutively

  1. cach = 19.6 >>> No problems with calculation processing and Status.

Executing “Run the test” with this value of cid, No.11, 12, 13, 18, 19 failed.

so this means you cannot in your own testing find any issue?
Only the tests are failing (but your testing shows no problems?)

edit: here’s another test that I tried that failed. Hopefully you can use this to debug.

in the js code set the price and cid as follows:

let price = 1.5;
let cid = [
  ['PENNY', 0.11],
  ['NICKEL', 0],
  ['DIME', 0.3],
  ['QUARTER', 0],
  ['ONE', 1],
  ['FIVE', 1],
  ['TEN', 1],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];

Then in the cash input type:
2.61

This should give a change of 1 dollar, 1 dime and 1 penny
Instead it just says INSUFFICIENT_FUNDS

I appreciate your continued support…

Yes, my own tests did not find the Issue
But the test failed.

I also ran the test with the numbers you gave me in cid, price and cash,
I got back 1 dollar, 1 dime and 1 penny change.
The rest of the amounts in the register are also deducted correctly.
The status is returning “OPEN”.

Since I’m not a native English speaker, I try to translate the English to understand what it means, but I don’t understand it, so please let me check.
Does it mean that the INSUFFICIENT_FUNDS result should be returned when the incorrect values of [FIVE’, 1], [‘TEN’, 1] are entered?

no I’m saying that I got back INSUFFICIENT_FUNDS when I tried your code.
But you said that your code is working?
So I’m not sure if you have given us the correct code?
I’m using the code you posted above.

Okay, I understand.
I will send you the current whole code again.
I would appreciate your confirmation.

<!DOCTYYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="styles.css">
    <title>Cash Register</title>
  </head>
  <body>
    <main>
      <img class="freecodecamp-logo" src="https://cdn.freecodecamp.org/platform/universal/fcc_primary.svg" alt="freeCodeCamp Logo" width="265">
      <h1>Cash Register Project</h1>
      <div id="change-due">
        <p id="change-status"></p>
        <p id="change-hundred"></p>
        <p id="change-twenty"></p>
        <p id="change-ten"></p>
        <p id="change-five"></p>
        <p id="change-one"></p>
        <p id="change-quarter"></p>
        <p id="change-dime"></p>
        <p id="change-nickel"></p>
        <p id="change-penny"></p>
      </div>

      <div id="input-div">
        <label for="cash">Enter cash from customer:</label>
        <input id="cash" type="number">
        <button id="purchase-btn">Purchase</button>
      </div>
      <div id="drawer-top">
        <p id="price"></p>   
      </div>
      <div id="drawer-middle">
        <div class="drawer-middle-pattern">
          <span id="pattern1"><span>
          <span id="pattern2"><span>
          <span id="pattern3"><span>
          <span id="pattern4"><span>
          <span id="pattern5"><span>
          <span id="pattern6"><span>
          <span id="pattern7"><span>
          <span id="pattern8"><span>
          <span id="pattern9"><span>
        </div>
        <div class="drawer-middle-display">
            <p id="drawer-title">Change in drawer:</p>
          <span>
            <p id="drawer-pennies"></p>
            <p id="drawer-nickels"></p>
            <p id="drawer-dimes"></p>
            <p id="drawer-quarters"></p>
            <p id="drawer-ones"></p>
            <p id="drawer-fives"></p>
            <p id="drawer-tens"></p>
            <p id="drawer-twenties"></p>
            <p id="drawer-hundreds"></p>
          </span>
        </div>
      </div>
      <div id="drawer-bottom">
        <span id="drawer-bottom-pattern"></span>
      </div>
    </main>
  </body>
  <!-- Import library through CDN-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/decimal.js/10.4.2/decimal.min.js"></script>
  <script src="script.js"></script>
</html>
let price = 1.5;
let cid = [
  ['PENNY', 0.11],
  ['NICKEL', 0],
  ['DIME', 0.3],
  ['QUARTER', 0],
  ['ONE', 1],
  ['FIVE', 1],
  ['TEN', 1],
  ['TWENTY', 0],
  ['ONE HUNDRED', 0]
];

// To avoid decimal calculations, convert to cents.
// let centCid = cid.map(([coin, amount]) => [coin, Math.round(amount * 100)]);

let centCid = cid.map(([coin, amount]) => {
  let decimalAmount = new Decimal(amount);
  let decimalCid = decimalAmount.mul(100);
  return [coin, decimalCid.toNumber()];
});
console.log(centCid);

let totalCid = 0;
let cashStock;
let result;
let purchaseBtnCount;
let availableCid = [];

// get HTMl elements
const changeStatus = document.getElementById('change-status');
const changeHundred = document.getElementById('change-hundred');
const changeTwenty = document.getElementById('change-twenty');
const changeTen = document.getElementById('change-ten');
const changeFive = document.getElementById('change-five');
const changeOne = document.getElementById('change-one');
const changeQuarter = document.getElementById('change-quarter');
const changeDime = document.getElementById('change-dime');
const changeNickel = document.getElementById('change-nickel');
const changePenny = document.getElementById('change-penny');

const cash = document.getElementById('cash');
const purchaseBtn = document.getElementById('purchase-btn');
const priceElement = document.getElementById('price');

const drawerPennies = document.getElementById('drawer-pennies');
const drawerNickels = document.getElementById('drawer-nickels');
const drawerDimes = document.getElementById('drawer-dimes');
const drawerQuarters = document.getElementById('drawer-quarters');
const drawerOnes = document.getElementById('drawer-ones');
const drawerFives = document.getElementById('drawer-fives');
const drawerTens = document.getElementById('drawer-tens');
const drawerTwenties = document.getElementById('drawer-twenties');
const drawerHundreds = document.getElementById('drawer-hundreds');

// Display price
priceElement.innerHTML = `<p>Price: $${price}</p>`;

// Display drawer
const penny = cid.find(coin => coin[0] === 'PENNY');
drawerPennies.innerHTML = `<p>Pennies: $${penny[1]}</p>`;
const nickel = cid.find(coin => coin[0] === 'NICKEL');
drawerNickels.innerHTML = `<p>Nickels: $${nickel[1]}</p>`;
const dime = cid.find(coin => coin[0] === 'DIME');
drawerDimes.innerHTML = `<p>Dimes: $${dime[1]}</p>`;
const quarter = cid.find(coin => coin[0] === 'QUARTER');
drawerQuarters.innerHTML = `<p>Quarters: $${quarter[1]}</p>`;
const one = cid.find(coin => coin[0] === 'ONE');
drawerOnes.innerHTML = `<p>Ones: $${one[1]}</p>`;
const five = cid.find(coin => coin[0] === 'FIVE');
drawerFives.innerHTML = `<p>Fives: $${five[1]}</p>`;
const ten = cid.find(coin => coin[0] === 'TEN');
drawerTens.innerHTML = `<p>Tens: $${ten[1]}</p>`;
const tenty = cid.find(coin => coin[0] === 'TWENTY');
drawerTwenties.innerHTML = `<p>Twenties: $${tenty[1]}</p>`;
const hundred = cid.find(coin => coin[0] === 'ONE HUNDRED');
drawerHundreds.innerHTML = `<p>Hundreds: $${hundred[1]}</p>`;

// Reset #change-due
const resetChangeDue = () => {
  changeHundred.innerHTML = '';
  changeTwenty.innerHTML = '';
  changeTen.innerHTML = '';
  changeFive.innerHTML = '';
  changeOne.innerHTML = '';
  changeQuarter.innerHTML = '';
  changeDime.innerHTML = '';
  changeNickel.innerHTML = '';
  changePenny.innerHTML = '';
};

// Check register cash's count
const checkRegister = (availableCid) => {
  const hundredIndex = availableCid.findIndex(coin => coin[0] === 'ONE HUNDRED');
  const twentyIndex = availableCid.findIndex(coin => coin[0] === 'TWENTY');
  const tenIndex = availableCid.findIndex(coin => coin[0] === 'TEN');
  const fiveIndex = availableCid.findIndex(coin => coin[0] === 'FIVE');
  const oneIndex = availableCid.findIndex(coin => coin[0] === 'ONE');
  const quarterIndex = availableCid.findIndex(coin => coin[0] === 'QUARTER');
  const dimeIndex = availableCid.findIndex(coin => coin[0] === 'DIME');
  const nickelIndex = availableCid.findIndex(coin => coin[0] === 'NICKEL');
  const pennyIndex = availableCid.findIndex(coin => coin[0] === 'PENNY');

  // Now you can access the coin name using index 0
  const hundred = availableCid[hundredIndex][1];
  const twenty = availableCid[twentyIndex][1];
  const ten = availableCid[tenIndex][1];
  const five = availableCid[fiveIndex][1];
  const one = availableCid[oneIndex][1];
  const quarter = availableCid[quarterIndex][1];
  const dime = availableCid[dimeIndex][1];
  const nickel = availableCid[nickelIndex][1];
  const penny = availableCid[pennyIndex][1];

  return cashStock = {
    hundred,
    twenty,
    ten,
    five,
    one,
    quarter,
    dime,
    nickel,
    penny
  };
};

// Check coin pattern
const checkCoinPattern = (availableCid, difference) => {
  cashStock = checkRegister(availableCid);

  let numHundred = 0;
  let numTwenty = 0;
  let numTen = 0;
  let numFive = 0;
  let numOne = 0;
  let numQuarter = 0;
  let numDime = 0;
  let numNickel = 0;
  let numPenny = 0;
  let leftHundred = cashStock.hundred;
  let leftTwenty = cashStock.twenty;
  let leftTen = cashStock.ten;
  let leftFive = cashStock.five;
  let leftOne = cashStock.one;
  let leftQuarter = cashStock.quarter;
  let leftDime = cashStock.dime;
  let leftNickel = cashStock.nickel;
  let leftPenny = cashStock.penny;
  let changeFlg = false;

  // Calc cash
  if (difference >= 10000 && cashStock.hundred >= 10000) {
    if (difference <= cashStock.hundred) {
      numHundred = Math.floor(difference / 10000) * 10000;
    } else {
      numHundred = cashStock.hundred;
    }
      difference = difference - numHundred;
      leftHundred = cashStock.hundred - numHundred;
    }

    if (difference >= 2000 && cashStock.twenty >= 2000) {
      if (difference <= cashStock.twenty) {
        numTwenty = Math.floor(difference / 2000) * 2000;
      } else {
        numTwenty = cashStock.twenty;
      }
        difference = difference - numTwenty;
        leftTwenty = cashStock.twenty - numTwenty; 
    }

    if (difference >= 1000 && cashStock.ten >= 1000) {
      if (difference <= cashStock.ten) {
        numTen = Math.floor(difference / 1000) * 1000;
      } else {
        numTen = cashStock.ten;
      }
      difference = difference - numTen;
      leftTen = cashStock.ten - numTen;
    }

    if (difference >= 500 && cashStock.five >= 500) {
      if (difference <= cashStock.five) {
        numFive = Math.floor(difference / 500) * 500;
      } else {
        numFive = cashStock.five;
      }
        difference = difference - numFive;
        leftFive = cashStock.five - numFive;
      }
      
      if (difference >= 100 && cashStock.one >= 100) {
        if (difference <= cashStock.one) {
            numOne = Math.floor(difference / 100) * 100;
        } else {
          numOne = cashStock.one ;
        }
          difference = difference - numOne;
          leftOne = cashStock.one - numOne;
        }

        if (difference >= 25 && cashStock.quarter >= 25) {
          if (difference <= cashStock.quarter) {
            numQuarter = Math.floor(difference / 25) * 25;
          } else {
            numQuarter = cashStock.quarter;
          }
          difference = difference - numQuarter;
          leftQuarter = cashStock.quarter - numQuarter;
        }

        if (difference >= 10 && cashStock.dime >= 10) {
          if (difference <= cashStock.dime) {
            numDime = Math.floor(difference / 10) * 10;
          } else {
              numDime = cashStock.dime;
          }
          difference = difference - numDime;
          leftDime = cashStock.dime - numDime;
        }

        if (difference >= 5 && cashStock.nickel >= 5) {
          if (difference <= cashStock.nickel) {
              numNickel = Math.floor(difference / 5) * 5;
          } else {
            numNickel = cashStock.nickel;
          }
          difference = difference - numNickel;
          leftNickel = cashStock.nickel - numNickel
        }

        if (difference >= 1 && cashStock.penny >= 1) {
          if (difference <= cashStock.penny) {
            numPenny = difference;
          } else {
            numPenny = cashStock.penny;
          }
          difference = difference - numPenny;
          leftPenny = cashStock.penny - numPenny;
        }

        console.log("残りのおつり¢",difference);
        
        if (difference > 0) {
          changeFlg = false;
        } else {
          changeFlg = true;
        }

        return result =
       {
        numHundred,
        numTwenty,
        numTen,
        numFive,
        numOne,
        numQuarter,
        numDime,
        numNickel,
        numPenny,
        leftHundred,
        leftTwenty,
        leftTen,
        leftFive,
        leftOne,
        leftQuarter,
        leftDime,
        leftNickel,
        leftPenny,
        changeFlg
      };

};

window.onload = function() {
  purchaseBtnCount = 0;
};

purchaseBtn.addEventListener('click', () => {
  resetChangeDue();
//  const sentCash = parseInt(cash.value * 100);
const sentCash = new Decimal(cash.value).mul(100).toNumber();
//  const sentPrice = parseInt(price * 100);
const sentPrice = new Decimal(price).mul(100).toNumber();
  console.log("受取金額¢", sentCash);
  console.log("値段¢", sentPrice);

  // Check inputted cash
  // Not enough cash
  if (sentCash < sentPrice) {
    alert('Customer does not have enough money to purchase the item');
  }
  // No cash
  if (sentCash === sentPrice) {
    changeStatus.innerHTML = '<p>No change due - customer paid with exact cash</p>';
  }

  // Calcurate cash
  if (sentCash > sentPrice) {
    purchaseBtnCount++;

    if (purchaseBtnCount > 1) {
      availableCid = availableCid.slice();
      // Calcurate register total

    } else {
      availableCid = centCid.slice();
      // Calcurate register total

    }
    
    totalCid = parseFloat(availableCid.reduce((total, coin) => total + coin[1], 0));
      //console.log("レジ(¢)",availableCid);
      console.log(centCid);

    // Calcurate register total
    //let difference =  Math.floor((cash - price).toFixed(2) * 100) ;
    let difference =  sentCash - sentPrice;

    console.log("おつり¢",difference);

    // Check lack of change
    if (difference > totalCid) {
      changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
              console.log(difference , totalCid);
    } else {
      result = checkCoinPattern(availableCid, difference);
      console.log("計算結果", result);

      // Check coin pattern
      if (!result.changeFlg) {
        // Enable to return change
        changeStatus.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
      // Return changes
      } else {
        // Display #change-due
        result.numHundred >= 10000 ? 
        changeHundred.innerHTML = `<p>ONE HUNDRED: $${result.numHundred / 100}</p>` : '';

        result.numTwenty >= 2000 ? 
          changeTwenty.innerHTML = `<p>TWENTY: $${result.numTwenty / 100}</p>` : '';

        result.numTen >= 1000 ? 
          changeTen.innerHTML = `<p>TEN: $${result.numTen / 100}</p>` : '';

        result.numFive >= 500 ? 
          changeFive.innerHTML = `<p>FIVE: $${result.numFive / 100}</p>` : '';
      
        result.numOne >= 100 ? 
          changeOne.innerHTML = `<p>ONE: $${result.numOne / 100}</p>` : '';
      
        result.numQuarter >= 25 ? 
          changeQuarter.innerHTML = `<p>QUARTER: $${result.numQuarter / 100}</p>` : '';
      
        result.numDime >= 10 ? 
          changeDime.innerHTML = `<p>DIME: $${result.numDime / 100}</p>` : '';
      
        result.numNickel >= 5 ? 
          changeNickel.innerHTML = `<p>NICKEL: $${result.numNickel / 100}</p>` : '';
      
        result.numPenny >= 1 ? 
          changePenny.innerHTML = `<p>PENNY: $${result.numPenny / 100}</p>` : '';

        // Update drawer
        drawerPennies.innerHTML = `<p>Pennies: $${result.leftPenny / 100}</p>`;

        drawerNickels.innerHTML = `<p>Nickels: $${result.leftNickel / 100}</p>`;

        drawerDimes.innerHTML = `<p>Dimes: $${result.leftDime / 100}</p>`;

        drawerQuarters.innerHTML = `<p>Quarters: $${result.leftQuarter / 100}</p>`;

        drawerOnes.innerHTML = `<p>Ones: $${result.leftOne / 100}</p>`;

        drawerFives.innerHTML = `<p>Fives: $${result.leftFive / 100}</p>`;

        drawerTens.innerHTML = `<p>Tens: $${result.leftTen / 100}</p>`;

        drawerTwenties.innerHTML = `<p>Twenties: $${result.leftTwenty / 100}</p>`;

        drawerHundreds.innerHTML = `<p>Hundreds: $${result.leftHundred / 100}</p>`;

        availableCid = [
            ['PENNY', result.leftPenny],
            ['NICKEL', result.leftNickel],
            ['DIME', result.leftDime],
            ['QUARTER', result.leftQuarter],
            ['ONE', result.leftOne],
            ['FIVE', result.leftFive],
            ['TEN', result.leftTen],
            ['TWENTY', result.leftTwenty],
            ['ONE HUNDRED', result.leftHundred]
        ];

        // Change Status
        if (sentPrice < sentCash && totalCid - difference > 0) { 
        changeStatus.innerHTML = '<p>Status: OPEN</p>';
        } else if (sentPrice < sentCash && difference === totalCid) {
        changeStatus.innerHTML = '<p>Status: CLOSED</p>';
        }
      }
    }
  }
  // Clear inputed cash
  cash.value = '';
});