2016-05-03 57 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;