paypal自适应支付问题 - 小数金额四舍五入

时间:2017-10-03 17:28:38

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

我在一个网站上集成了paypal自适应支付系统,但是我收到错误,当我检查如果最多2位小数的数字没有四舍五入,分数金额可能会丢失。这是什么解决方案?我目前正在计算金额,但是任何想法如何获得小数金额?

2 个答案:

答案 0 :(得分:0)

您必须确保您向PayPal发送的金额已正确舍入为该币种。这意味着美元金额最多只有2个子单位(美分)。

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

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

2.20 - 2.01 = 0.1900000000000004

如果您在将参数传递给build_pay方法时正确设置金额的子单元,并且您仍然收到错误...

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

那么这个问题很可能就在他们使用浮动的宝石之内。您的日志会显示此内容,您可以使用金额715.57对其进行测试,因为他们在715.57000000001 .to_f中使用了paypal-sdk-core } gem。

为了解决这个问题,我在我的应用程序中修改了他们的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。我不能说这是最优雅的解决方案,但它确实有效。我也在他们的回购中创建了一个问题,希望很快能收到回复。

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

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

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

答案 1 :(得分:-1)

如果您使用的是PHP,则可以应用此解决方案。就我而言,它可以正常工作

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

将四舍五入后的金额发送给PayPal,希望它能起作用!