2017-10-03 3 views
0

Ich habe paypal adaptive Bezahlsystem in einer Website integriert, aber ich bekomme einen Fehler, während ich auschecke, dass, wenn die Menge bis zu 2 Dezimalstellen nicht abgerundet ist, der Bruchbetrag sein könnte hat verloren. Was ist die Lösung dafür? Ich rundee gerade die Beträge ab, aber irgendeine Idee, wie man den Bruchteilbetrag auch erhält?paypal Adaptive Zahlungsproblem - Bruchbetrag ist abgerundet

+0

Welche Währung verwenden Sie, dass mehr als zwei Ziffern rechts vom Komma verwendet Punkt? Die kleinste Einheit der US-Währung ist ein Cent (0,01), und es gibt keinen kleineren * Teilbetrag * als 1/100 eines Dollars. Die Lösung ist eine ordentliche Rundung, so dass Bruchstücke (Cent) entsprechend aufgerundet werden. Sie können einem Kunden nicht sehr gut sagen * Ihre Kosten betragen $ 11.125 *, wenn das nicht auf der Abrechnung steht. –

Antwort

0

Sie müssen sicherstellen, dass der Betrag, den Sie an PayPal senden, für die Währung richtig gerundet wird. Dies bedeutet, dass ein US-Dollar-Betrag höchstens 2 Untereinheiten (Cent) hätte.

Bei Verwendung der adaptiven Lohnedelsteine ​​Rubin und immer noch Probleme auftreten:

Ein weiteres Problem, das ich vor kurzem in ihren Rubin Edelsteine ​​lief ist, dass sie schwebt statt Dezimalstellen verwenden, was eine schlechte Praxis für monetäre Werte ist . Floats sind ungenau. Zum Beispiel in Ruby ...

2.20 - 2.01 = 0.1900000000000004

Wenn Sie richtig die Menge der Untereinheiten Einstellung sind, wenn in der param ihre build_pay Methode übergeben und Sie immer noch den Fehler bekommen ...

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

dann kann das Problem sehr gut innerhalb der Verwendung von Float in ihrem Edelstein sein. Ihre Protokolle zeigen dies, und Sie können es testen, indem Sie die Menge 715.57 verwenden, die ihr Edelstein an ihre API als 715.57000000001 wegen ihrer Verwendung von .to_f in ihrem paypal-sdk-core Juwel sendet.

Um dies zu beheben, gepatcht ich Affen ihre Float Klasse in meinem Rails-Anwendung durch das Hinzufügen dieser zu meiner app, im Wesentlichen es als BigDecimal statt einem Float Gießen:

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 

meine config/initializers/paypal.rb. Ich kann nicht sagen, dass dies die eleganteste Lösung ist, aber es funktioniert. Ich habe auch ein Problem in ihrem Repo erstellt und kann es hoffentlich bald wieder hören.

Weitere Informationen über float Probleme mit Währung:

Referenz 1: https://stackoverflow.com/a/3730040/1109211

Referenz 2: https://stackoverflow.com/a/3730249/1109211

Verwandte Themen