2016-08-08 10 views
2

私はFreeCodeCampでアルゴリズムチャレンジを解決しようとしています。JavaScriptで正確な計算を計算する

デザインレジの引き出し機能checkCashRegister()最初の引数(価格)、第二引数(現金)として支払い、および現金と購入価格を受け入れ:ここ

は、問題のプロンプトです第3引数としてイン・ドロワ(cid)を使用します。

cidは利用可能な通貨をリストした2D配列です。

現金引き出しが 未満の場合、文字列「不十分な資金」が返されます。現金引き出しが と等しい場合は、 "Closed"という文字列を返します。

それ以外の場合は、コインと紙幣の交換を返し、最高で の最低注文にソートします。

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) 

を返す必要があります:[["QUARTER", 0.50]]

checkCashRegister(3.26, 100.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) 

を返す必要があります:[["TWENTY", 60.00], ["TEN", 20.00], ["FIVE", 15.00], ["ONE", 1.00], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]]

function checkCashRegister(price, cash, cid) { 
    var change = 100 * (cash - price); 
    var availableFunds = 0; 

    var moneyValues = [1, 5, 10, 25, 100, 500, 1000, 2000, 10000]; 
    var amtToReturn = []; 

    for (var i = cid.length - 1; i >= 0; i--){ 
    var amt = 0; 
    while (moneyValues[i] <= change && cid[i][1] > 0 && change > 0){ 
     console.log("subtracting " + moneyValues[i]); 
     cid[i][1] -= moneyValues[i]/100; // reduce amount in cid 
     change -= moneyValues[i]; // reduce amount from change 
     amt += moneyValues[i]/100; // keep track of how much money was taken out of cid 
    } 
    if (amt !== 0){ 
     // adds record of amount taken out of cid 
     amtToReturn.push([cid[i][0], amt.toFixed(2)]); 
    } 
    } 


    // if there is still some change left over 
    if (change !== 0){ 
    console.log("broke"); 
    console.log(change); 
    return "Insufficient Funds"; 
    } 

    // if there is any money left in cid, it returns amtToReturn 
    for (var j = 0; j < cid.length; j++){ 
    if (cid[j][1] > 0){ 
     console.log(amtToReturn); 
     return amtToReturn; 
    } 
    } 

    // if register is empty 
    console.log("closed"); 
    return "Closed"; 

} 

// Example cash-in-drawer array: 
// [["PENNY", 1.01], 0 
// ["NICKEL", 2.05], 1 
// ["DIME", 3.10], 2 
// ["QUARTER", 4.25],3 
// ["ONE", 90.00], 4 
// ["FIVE", 55.00], 5 
// ["TEN", 20.00], 6 
// ["TWENTY", 60.00],7 
// ["ONE HUNDRED", 100.00]]8 

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]); 

私が使用し

私のソリューションは、以下を除いて、ほとんどのパラメータのために働きます値浮動小数点精度の誤差を避けるためセントでのお金の私はこの問題を終わらせることができない小さなバグがあるような気がします。ここで

はフィドルです:https://jsfiddle.net/odyjcmfj/

+0

何が返されますか? –

+0

何か不足していますか?あなたのコードは、あなたが期待していたことを正確に返します。 – Arnauld

+0

@Jonasw [削除] –

答えて

1

彼らは明らかに["BILL", value]配列の2番目のエントリとして数値を期待しています。

だけ置き換えますと

amtToReturn.push([cid[i][0], amt.toFixed(2)]); 

を:

amtToReturn.push([cid[i][0], amt]); 

とあなたが行って、すべて設定する必要があります。

+0

ありがとうございました! –