J'ai intégré paypal système de paiement adaptatif dans un site Web, mais j'obtiens une erreur pendant que je vérifie que si le montant jusqu'à 2 décimales n'est pas arrondi, le montant fractionnaire pourrait être perdu. Quelle est la solution pour ceci? Je suis en train d'arrondir les montants, mais vous savez aussi comment obtenir le montant fractionnaire?paypal Adaptive payment issue- le montant fractionnaire est arrondi
Répondre
Vous devez vous assurer que le montant que vous envoyez à PayPal est arrondi correctement pour la devise. Cela signifie qu'un montant en dollars américains aurait au plus 2 sous-unités (cents).
Si vous utilisez les pierres précieuses rubis de paie adaptatives et rencontrez toujours des problèmes:
Une autre question que j'ai récemment rencontré avec leurs pierres précieuses rubis est qu'ils utilisent des flotteurs au lieu de décimales, ce qui est une mauvaise pratique pour les valeurs monétaires . Les flotteurs sont inexacts. Par exemple, en rubis ...
2.20 - 2.01 = 0.1900000000000004
Si vous configurez correctement les sous-unités de la quantité lors du passage dans la méthode à leur param build_pay
et vous obtenez toujours l'erreur ...
If the fractional amount is rounded for currency conversion, funds could be lost
alors le problème peut très bien être dans l'utilisation de float par leur gemme. Vos journaux afficheront cela, et vous pouvez le tester en utilisant le montant 715.57
, que leur gem envoie à leur API comme 715.57000000001
en raison de leur utilisation de .to_f
dans leur gemme paypal-sdk-core
.
Pour résoudre ce problème, le singe I patché leur application classe Float
dans mes rails en ajoutant à mon application, jetant essentiellement comme un BigDecimal au lieu d'un flotteur:
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
à mon config/initializers/paypal.rb
. Je ne peux pas dire que c'est la solution la plus élégante, mais cela fonctionne. J'ai aussi créé un problème sur leur repo, et j'espère pouvoir vous répondre bientôt.
Plus d'informations sur les problèmes de flotteur avec monnaie:
Référence 1: https://stackoverflow.com/a/3730040/1109211
Référence 2: https://stackoverflow.com/a/3730249/1109211
Quelle est la devise que vous utilisez qui utilise plus de deux chiffres à la droite de la virgule point? La plus petite unité de la devise américaine est un cent (0,01), et il n'y a pas de plus petit * montant fractionnaire * que 1/100 de dollar. La solution est l'arrondi approprié, de sorte que les cents fractionnaires soient arrondis vers le haut (ou vers le bas) de manière appropriée. Vous ne pouvez pas très bien dire à un client * Votre coût est de 11,125 $ *, alors que ce n'est pas ce qui va apparaître sur leur relevé. –