每次解析时,JavaScript数字均未正确添加浮动至固定

时间:2019-01-17 00:18:16

标签: javascript paypal parsefloat tofixed

我正在根据以下内容计算小计,税金,运输和保险:

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"
}

以下是几个屏幕截图: you can see the hidden inputs have the correct values you can see the data posted to PayPal

可以肯定的是,随着产品数量的增加,添加的数量以及给定的数量之间的差异也随之增加,这引出了我的总体问题。

我应该如何正确计算这些项目?

预先感谢

2 个答案:

答案 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 }}"
    />

以下是订单在贝宝(Paypal)仪表盘中的外观: paypal dashboard detail of order