一起增加价值(美元金额)并防止四舍五入

时间:2013-04-10 14:02:31

标签: javascript jquery addition

我需要在不对值进行舍入的情况下添加值(美元金额)。

示例:

添加的值来自$("input#lunchorder_item_price")并输出我的subTotal。 2.95 + 2.95 + 2.45 = 8.35 但我得到 2.95 + 2.95 + 2.45 = 8.36

当前代码:

 function updateCartDisplayTotal() {
     $("div#ordersummary").remove();

     var subTotal = 0;
     $("input#lunchorder_item_price").each(function() {
        subTotal += parseFloat((this.value) + subTotal);
     });

     var orderSubtotal = subTotal.toFixed(2);
     var taxAmount = parseFloat(orderSubtotal*.0685)/*.toFixed(2)*/;
     var deliveryAmount = parseFloat(orderSubtotal*.10)/*.toFixed(2)*/;
     var orderTotal = (parseFloat(orderSubtotal) + parseFloat(taxAmount) + parseFloat(deliveryAmount))/*.toFixed(2)*/;

     var orderSummary = $("<div id=\"ordersummary\"><div>Subtotal: <strong>$"+ orderSubtotal +"</strong></div><div>Tax: <strong>$"+ taxAmount +"</strong></div><div>Delivery Fee: <strong>$"+ deliveryAmount +"</strong></div><div>Total: <strong>$"+ orderTotal +"</strong></div></div>");
     $(orderSummary).insertAfter("ul#cart-items");
  }

我的问题是我需要做些什么来防止这些四舍五入?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

问题的第一部分是floating point arithmetic generally sucks。使用浮点数,你的例子......

2.95 + 2.95 + 2.45

...实际上等于8.350000000000001

问题的第二部分是浏览器具有toFixed()的不一致实现(某些向上舍入,有些向下舍入,有些舍入到最接近的有效数字)。

以下是一些避免这些问题的技巧:

  1. 如果您需要跨浏览器一致性(显然您在此处执行),请避免使用toFixed()
  2. 不要做任何中间 round / floor / ceil /等。操作 - 保存到最后。即,除了显示之外,不要弄乱subTotaltaxAmount等值。
  3. 当您需要执行类似toFixed()的操作时,通常会有其他解决方案依赖于更准确,更一致的操作(例如Math.round())。例如,要获得双精度数,可以执行以下操作:

    var total = 2.95 + 2.95 + 2.45;

    total = Math.round(total * 100) / 100;


  4. 以下是使用上述建议的代码重构:

    function toDoubleFixed(num) {
        var ret = '' + Math.round(num * 100) / 100;
        return ret.replace(/(\d+)?\.?(\d)?(\d)?/, function(match, l, r1, r2) {
            return (l||'0')+'.'+(r1||'0')+(r2||'0');
        });
    }
    
    function updateCartDisplayTotal() {
        $("div#ordersummary").remove();
    
        var subTotal = 0;
        $("input#lunchorder_item_price").each(function() {
            subTotal += +$(this).val();
        });
    
        var orderSubtotal = subTotal,
            taxAmount = orderSubtotal * .0685,
            deliveryAmount = orderSubtotal * .1,
            orderTotal = orderSubtotal + taxAmount + deliveryAmount;
    
        var $orderSummary = $("<div id=\"ordersummary\"><div>Subtotal: <strong>$" + toDoubleFixed(orderSubtotal) +"</strong></div><div>Tax: <strong>$"+ toDoubleFixed(taxAmount) +"</strong></div><div>Delivery Fee: <strong>$"+ toDoubleFixed(deliveryAmount) +"</strong></div><div>Total: <strong>$"+ toDoubleFixed(orderTotal) +"</strong></div></div>");
    
        $orderSummary.insertAfter("ul#cart-items");
    }
    

    我无法测试它,所以请让我知道它是如何工作的。此外,请注意我修改了你的subTotal值的增量,因为它看起来很糟糕......但也许我在那里遗漏了一些东西。

答案 1 :(得分:0)

我通常将这样的值存储为便士金额。然后它更容易使用。

因此$ 4.95变为495而$ 16.32变为1632.然后你可以使用完整整数并简单地添加小数点。

如果您可以切换到此方法,我建议您使用此方法。否则将字符串/浮点值转换为整数,根据需要对其进行数学运算,然后返回结果。