我正在根据以下内容计算小计,税金,运输和保险:
public getSubTotal() {
this.subTotal =
document.getElementById("total").value -
(document.getElementById("total").value * 0.07 +
document.getElementById("total").value * 0.03 +
document.getElementById("total").value * 0.01 +
1.0);
document.getElementById("tax").value =
document.getElementById("total").value * 0.07;
document.getElementById("shipping").value =
document.getElementById("total").value * 0.03;
document.getElementById("insurance").value =
document.getElementById("total").value * 0.01;
console.log(
"tax: " +
document.getElementById("total").value * 0.07 +
" shipping: " +
document.getElementById("total").value * 0.03 +
" ins: " +
document.getElementById("total").value * 0.01 +
" total: " +
document.getElementById("total").value +
" subtotal: " +
this.subTotal
);
return this.subTotal.toFixed(2);
}
details: {
subtotal: document.getElementById("subTotal").value,
tax: parseFloat(document.getElementById("tax").value).toFixed(
2
),
shipping: parseFloat(
document.getElementById("shipping").value
).toFixed(2),
handling_fee: "1.00",
shipping_discount: "0.00",
insurance: parseFloat(
document.getElementById("insurance").value
).toFixed(2)
}
每个产品的总和是固定的。
当我将其发布到PayPal API时,这些数字有时会加起来,有时却没有。我迷失了如何解决它。
以下是发布内容的示例,我不明白为什么贝宝拒绝该示例:
details {…}
handling_fee 1.00
insurance 0.23
shipping 0.68
shipping_discount 0.00
subtotal 19.30
tax 1.60
total 22.81
所有这些数字均基于22.81,控制台显示:
tax: 1.5967
shipping: 0.6842999999999999
ins: 0.2281
total: 22.81
subtotal: 19.3009
如何防止parseFloat()。toFixed(2)更改数字?如果我将数字保留为两个以上的小数位数,则PayPal会拒绝该数字的格式错误。
在这些数字上使用计算器时,我收到的结果是22.81
以下是我从贝宝(PayPal)收到的错误-如果我注释掉详细信息部分,则该帖子会顺利进行:
Error: Request to post https://www.sandbox.paypal.com/v1/payments/payment failed with 400 error. Correlation id: 12d500c6247f1, 12d500c6247f1
{
"name": "VALIDATION_ERROR",
"details": [
{
"field": "transactions[0]",
"issue": "Item amount must add up to specified amount subtotal (or total if amount details not specified)"
}
],
"message": "Invalid request - see details",
"information_link": "https://developer.paypal.com/docs/api/payments/#errors",
"debug_id": "12d500c6247f1"
}
可以肯定的是,随着产品数量的增加,添加的数量以及给定的数量之间的差异也随之增加,这引出了我的总体问题。
我应该如何正确计算这些项目?
预先感谢
答案 0 :(得分:0)
使用货币值时,您可以避免以美分为单位的舍入错误,将所有成本都以美分为单位,并且在显示它们时可以显示
(cost/100).toFixed(2)
这将在浮点上使用整数数学,并且您将获得更少的舍入误差。
答案 1 :(得分:0)
反复推算产品的价格,然后减去税金,运费,手续费和保险费,以得出小计-我突然意识到我正在做这种背景,并且由于浮点数有点“不可预测”,那么金额永远不可能在100%的时间内匹配。
那是它打击我的时刻,非常明显。我应该将所有这些数字加到产品价格上:
getFinalAmount() {
this.model.subTotal = this.subTotal = this.prdSrvc.getPriceTotal();
this.subTotal = parseFloat(this.subTotal).toFixed(2);
document.getElementById("tax").value = this.model.tax = this.tax =
this.subTotal * 0.07;
document.getElementById(
"shipping"
).value = this.model.shipping = this.shipping = this.subTotal * 0.03;
document.getElementById(
"insurance"
).value = this.model.insurance = this.insurance = this.subTotal * 0.01;
this.total = this.payPalSrvc.finalAmount =
parseFloat(this.tax) +
parseFloat(this.shipping) +
parseFloat(this.insurance) +
parseFloat(this.subTotal) +
1.0;
this.payPalSrvc.finalAmount = parseFloat(
this.payPalSrvc.finalAmount
).toFixed(2);
this.total = parseFloat(this.total).toFixed(2);
document.getElementById(
"subTotal"
).value = this.model.subTotal = this.subTotal;
document.getElementById("total").value = this.model.total = this.total;
this.tax = parseFloat(this.tax).toFixed(2);
this.shipping = parseFloat(this.shipping).toFixed(2);
this.insurance = parseFloat(this.insurance).toFixed(2);
return this.payPalSrvc.finalAmount;
}
我还从html中删除了货币管道,只剩下两个小数点的正数:
<input type="hidden" name="tax" id="tax" value="{{ this.tax }}" />
<input
type="hidden"
name="shipping"
id="shipping"
value="{{ this.shipping }}"
/>
<input
type="hidden"
name="insurance"
id="insurance"
value="{{ this.insurance }}"
/>