2016-05-03 79 views
2

我努力解決浮點數問題,其中var更改返回爲0.0999重複,我需要返回0.01(一分錢)。代碼工作正常,除了最後一分錢,因爲這個問題。 這是我的第一篇文章在這裏,所以請原諒格式化...浮點數問題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]]); 

應該返回

[ 「二十」,60.00],[ 「TEN」, 20.00],[ 「FIVE」,15.00],[ 「ONE」,1.00],[ 「季」,0.50],[ 「DIME」,0.20],[ 「便士」,0.0 ]]

但是它返回

[[「TWENTY」,60.00],[「TEN」,20.00],[「FIVE」,15.00],[「ONE」,1.00],[「QUARTER」,0.50] DIME「,0.20],[」PENNY「,0.0 ]]

在此先感謝!

+2

你真正的問題是什麼?如果你想知道_why_它這樣做,那麼你的答案在這裏:[浮點數學是否被破壞?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)如果你'不知道如何解決這個問題,那麼很簡單的答案是,將浮點與貨幣值混合並不是一個好主意。 –

+0

是的。我會乘以100的傳入值並將其轉換爲整數。你也可以通過使用除法和模數來提高你的算法的性能,我認爲...但這是一個不同的問題... – karina

+0

解決使用這種方法,謝謝! @karina –

回答

0

你可以得到預期的答案[「便士」,0.04]通過進行以下修改爲「變」中的「否則,如果」條件與PENNY

變化涉及= change.toFixed(2) - 0.01;