首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >paypal自适应支付问题-部分金额四舍五入

paypal自适应支付问题-部分金额四舍五入
EN

Stack Overflow用户
提问于 2017-10-04 01:28:38
回答 2查看 573关注 0票数 0

我有一个网站集成贝宝自适应支付系统,但我得到一个错误,当我结账时,如果金额高达2个小数位不四舍五入,小数点金额可能会丢失。这个问题的解决方案是什么?我目前正在四舍五入的金额,但有任何想法如何获得小数金额也?

EN

回答 2

Stack Overflow用户

发布于 2017-10-21 02:09:08

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

如果使用自适应支付ruby gem仍然遇到问题,则使用

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

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在他们的paypal-sdk-core gem中使用了.to_f,所以gem将其作为715.57000000001发送给他们的api。

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

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2018-07-30 15:48:53

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

代码语言:javascript
复制
$amount = 50.4854;
$roundedAmount = number_format(round($amount, 2), 2, '.', '');

发送四舍五入的金额到PayPal,希望它能工作!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46550224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档