我需要在不对值进行舍入的情况下添加值(美元金额)。
示例:
添加的值来自$("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");
}
我的问题是我需要做些什么来防止这些四舍五入?任何帮助将不胜感激!
答案 0 :(得分:3)
问题的第一部分是floating point arithmetic generally sucks。使用浮点数,你的例子......
2.95 + 2.95 + 2.45
...实际上等于8.350000000000001
。
问题的第二部分是浏览器具有toFixed()
的不一致实现(某些向上舍入,有些向下舍入,有些舍入到最接近的有效数字)。
以下是一些避免这些问题的技巧:
toFixed()
。round
/ floor
/ ceil
/等。操作 - 保存到最后。即,除了显示之外,不要弄乱subTotal
,taxAmount
等值。当您需要执行类似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
值的增量,因为它看起来很糟糕......但也许我在那里遗漏了一些东西。
答案 1 :(得分:0)
我通常将这样的值存储为便士金额。然后它更容易使用。
因此$ 4.95变为495而$ 16.32变为1632.然后你可以使用完整整数并简单地添加小数点。
如果您可以切换到此方法,我建议您使用此方法。否则将字符串/浮点值转换为整数,根据需要对其进行数学运算,然后返回结果。