【问题标题】:paypal Adaptive payment issue- fractional amount is rounded off贝宝自适应付款问题-小数四舍五入
【发布时间】:2018-03-14 23:35:50
【问题描述】:

我已在网站中集成了 paypal 自适应支付系统,但我在结帐时收到错误消息,如果未四舍五入小数点后 2 位的金额,小数部分可能会丢失。解决方案是什么?我目前正在四舍五入,但知道如何获得小数吗?

【问题讨论】:

  • 您使用的是哪种货币,其小数点右侧超过两位数?美元的最小单位是一美分(0.01),没有比一美元更小的小数。解决方案是适当的四舍五入,以便分数美分适当地向上(或向下)四舍五入。您不能很好地告诉客户您的成本是 11.125 美元,而这并不是他们的报表中将显示的内容。

标签: paypal paypal-sandbox paypal-adaptive-payments


【解决方案1】:

您必须确保您发送到 PayPal 的金额已针对该货币进行了正确的四舍五入。这意味着美元金额最多有 2 个子单位(美分)。

如果使用自适应支付红宝石宝石但仍然遇到问题:

我最近在使用他们的 ruby​​ gem 时遇到的另一个问题是他们使用浮点数而不是小数,这对于货币价值来说是一种不好的做法。浮点数不准确。例如在红宝石中...

2.20 - 2.01 = 0.1900000000000004

如果您在将参数传递给他们的build_pay 方法时正确设置了金额的子单位,但您仍然收到错误...

If the fractional amount is rounded for currency conversion, funds could be lost

那么问题很可能在于他们的 gem 对 float 的使用。您的日志将显示这一点,您可以使用 715.57 的数量对其进行测试,他们的 gem 将其作为 715.57000000001 发送到他们的 api,因为他们在 paypal-sdk-core gem 中使用了 .to_f

为了解决这个问题,我在我的 rails 应用程序中修补了他们的 Float 类,将其添加到我的应用程序中,基本上将其转换为 BigDecimal 而不是 Float:

module PayPal::SDK::Core
  module API
    module DataTypes
      module SimpleTypes
        class Float < ::Float
          def self.new(float)
            # Floats are inccurate. BigDecimal is better.
            # Ruby example: 2.20 - 2.01 = 0.1900000000000004
            # To support currencies with up to 4 subunits, we round(4)
            BigDecimal.new(float.to_f.round(4).to_s)
          end
        end
      end
    end
  end
end

致我的config/initializers/paypal.rb。我不能说这是最优雅的解决方案,但它确实有效。我也在他们的 repo 上创建了一个问题,希望很快能收到回复。

有关货币浮动问题的更多信息:

参考1:https://stackoverflow.com/a/3730040/1109211

参考2:https://stackoverflow.com/a/3730249/1109211

【讨论】:

    【解决方案2】:

    如果您使用的是 PHP,则可以应用此解决方案。它在我的情况下工作

    $amount = 50.4854;
    $roundedAmount = number_format(round($amount, 2), 2, '.', '');
    

    将四舍五入的金额发送到 PayPal,希望它会起作用!

    【讨论】:

      猜你喜欢
      • 2011-11-06
      • 2018-05-02
      • 2013-09-22
      • 2012-12-13
      • 2014-08-25
      • 2023-04-10
      • 2012-04-07
      • 2016-06-24
      • 2013-03-24
      相关资源
      最近更新 更多