【问题标题】:Floating Point Number issue JavaScript浮点数问题 JavaScript
【发布时间】:2016-08-28 11:40:25
【问题描述】:

我正在努力解决浮点数问题,其中 var 更改返回为 0.0999 重复出现,我需要返回 0.01(一美分)。由于这个问题,代码工作正常,除了最后一分钱。 这是我在这里的第一篇文章,所以请原谅格式...

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],[“十”,20.00],[“五”,15.00],[“一”,1.00],[“四分之一”,0.50],[“一角”,0.20 ], ["PENNY", 0.04]]

但它会返回

[[“二十”,60.00],[“十”,20.00],[“五”,15.00],[“一”,1.00],[“四分之一”,0.50],[“一角”,0.20 ], ["PENNY", 0.03]]

提前致谢!

【问题讨论】:

  • 您的实际问题是什么?如果您想知道 为什么 它会这样做,那么您的答案就在这里:Is floating point math broken? 如果您想知道如何解决它,那么非常简短的回答是混合起来很少是一个好主意具有货币价值的浮点数。
  • 是的。我会将传入的值乘以 100 并将它们转换为整数。你也可以通过使用除法和模数来提高你的算法的性能我认为......但这是一个不同的问题......
  • 用这个方法解决了,谢谢! @karina

标签: javascript floating-point precision


【解决方案1】:

您可以通过在处理 PENNY 的 'else if' 条件中对 'change' 进行以下修改来获得预期的答案 ["PENNY", 0.04]

change = change.toFixed(2) - 0.01;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2016-06-04
    相关资源
    最近更新 更多