我有一个网站集成贝宝自适应支付系统,但我得到一个错误,当我结账时,如果金额高达2个小数位不四舍五入,小数点金额可能会丢失。这个问题的解决方案是什么?我目前正在四舍五入的金额,但有任何想法如何获得小数金额也?
发布于 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:
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上创建了一个问题,希望很快就能收到回复。
有关货币浮动问题的更多信息,请访问:
发布于 2018-07-30 15:48:53
如果您使用的是PHP,则可以应用此解决方案。它在我的情况下是有效的
$amount = 50.4854;
$roundedAmount = number_format(round($amount, 2), 2, '.', '');发送四舍五入的金额到PayPal,希望它能工作!
https://stackoverflow.com/questions/46550224
复制相似问题