2

値を丸めずに値を追加する必要があります (ドルの金額を一緒に)。

例:

追加される値は$("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");
  }

私の質問は、これらが丸められないようにするにはどうすればよいですか? どんな助けでも大歓迎です!

4

2 に答える 2

3

問題の最初の部分は、浮動小数点演算が一般的にうまくいかないことです。フロートを使用すると、あなたの例は...

2.95 + 2.95 + 2.45

... 実際には のようなものと同じ8.350000000000001です。

問題の 2 番目の部分は、ブラウザーの実装に一貫性がないことですtoFixed()(切り上げ、切り捨て、最も近い有効数字への切り上げ)。

これらの問題を回避するためのテクニックを次に示します。

  1. toFixed()クロスブラウザーの一貫性が必要な場合は避けてください (明らかにここで行います)。
  2. 中間 roundの/ floor/ ceil/etcは行わないでください。操作 - 最後まで保存してください。つまり、表示以外の目的で 、 などの値をsubTotalいじらないでください。taxAmount
  3. 同様の操作を行う必要がある場合toFixed()は、通常、より正確で一貫して実装された操作 ( などMath.round()) に依存する代替ソリューションがあります。たとえば、倍精度数を取得するには、次のようにします。

    var total = 2.95 + 2.95 + 2.45;

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


上記の提案を利用したコードのリファクタリングは次のとおりです。

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...しかし、そこに何かが欠けている可能性があります。

于 2013-04-10T14:14:06.310 に答える