我在一个网站上集成了paypal自适应支付系统,但是我收到错误,当我检查如果最多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 :(得分:-1)
如果您使用的是PHP,则可以应用此解决方案。就我而言,它可以正常工作
$amount = 50.4854;
$roundedAmount = number_format(round($amount, 2), 2, '.', '');
将四舍五入后的金额发送给PayPal,希望它能起作用!