2016-05-03 17 views
2

私は浮動小数点数の問題を解決するのに苦労しています。ここで、varの変更は0.0999回繰り返され、0.01(1ペニー)を返す必要があります。この問題のため、最後の1ペニーを除いて、コードは正常に動作します。 これは非常に書式設定言い訳してくださいここで私の最初の投稿です...浮動小数点数の問題JavaScript

function checkCashRegister(price, cash, cid) { 
    var change = cash - price;  
    var totalCid =0; 

    for(var i = 0; i < cid.length; i++) totalCid += cid[i][1];  

    var returnArr = [["PENNY",0], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0],["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]; 

    function hasValue (value) {return value[1] > 0;} 

    if(change>totalCid) { 
     return "Insufficient Funds"; 
    } 
    else if(change==totalCid) { 
     return "Closed"; 
    } 

    else { 
     while(change >= 0.01) { 

      if (change >=100 && cid[8][1] >= 100){ 
       change -= 100; 
       cid[8][1] -= 100; 
       returnArr[8][1] += 100; 
      } 
      else if (change >= 20 && cid[7][1] >= 20){ 
       change -= 20; 
       cid[7][1] -= 20; 
       returnArr[7][1] += 20; 
      } 
      else if (change >= 10 && cid[6][1] >= 10){ 
       change -= 10; 
       cid[6][1] -= 10; 
       returnArr[6][1] += 10; 
      } 
      else if (change >= 5 && cid[5][1] >= 5){ 
       change -= 5; 
       cid[5][1] -= 5; 
       returnArr[5][1] += 5; 
      } 
      else if (change >= 1 && cid[4][1] >= 1){ 
       change -= 1; 
       cid[4][1] -= 1; 
       returnArr[4][1] += 1; 
      } 
      else if (change >= 0.25 && cid[3][1] >= 0.25) { 
       change -= 0.25; 
       cid[3][1] -= 0.25; 
       returnArr[3][1] += 0.25; 
      } 
      else if (change >= 0.10 && cid[2][1] >= 0.10){ 
       change -= 0.10; 
       cid[2][1] -= 0.10; 
       returnArr[2][1] += 0.10; 
      } 
      else if (change >= 0.05 && cid[1][1] >= 0.05){ 
       change -= 0.05; 
       cid[1][1] -= 0.05; 
       returnArr[1][1] += 0.05; 
      } 
      else if (change >= 0.01 && cid[0][1] >= 0.01){ 
       change -= 0.01; 
       cid[0][1] -= 0.01; 
       returnArr[0][1] += 0.01; 
      } 
      else return "Insufficient Funds"; 

     } 
     return returnArr.filter(hasValue).reverse(); 
    } 
} 

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]、[ "四半期"、0.50]、[ "DIME"、0.20]、[ "ペニー"、0.0 ]

しかし、それは返されます

[[TWENTY]、20.00]、["FIVE"、15.00]、["ONE"、1.00]、["QUARTER"、0.50]、[ DIME "、0.20]、[" PENNY "、0.0 ]

ありがとうございます!

+2

あなたの実際の質問は何ですか?あなたが疑問に思っているのであれば、それはこれを行います、あなたの答えはここにあります:[浮動小数点数学は壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)それを修正する方法が不思議であれば、非常に短い答えは、浮動小数点を金銭的価値と組み合わせることはめったに良い考えではないということです。 –

+0

うん。入力値に100を掛けてintに変換します。あなたはまた、分裂を使用して私の思考をモジューロであなたのアルゴのパフォーマンスを向上させることができます...しかし、それは別の質問です... – karina

+0

は、このメソッドを使用して解決、ありがとう! @カリナ –

答えて

0

あなたはPENNY

変更を扱う「他の場合は、」状態で予想答え「変更」のため、以下の変更を加えることにより、[「PENNY」、0.04]を得ることができる= change.toFixed(2) - 0.01;

関連する問題