RGJ
(Richard - Communiteq)
14. Januar 2026 um 17:44
1
Discourse-Subscriptions verwenden
Versuchen, einen Preisplan zu einem Produkt hinzuzufügen
Geben Sie 19,99 in das Preisfeld ein (dies ist bereits schwierig, da die Eingabe sich sehr seltsam verhält)
Versuchen Sie, zu senden
Fehlermeldung erhalten: „Ungültige Ganzzahl 1998.9999999999998“
Ich habe dies bisher nur mit Stable 3.5.3 getestet, aber der Code ist in Beta derselbe.
Code
@computed("unit_amount")
get amountDollars() {
return parseFloat(this.get("unit_amount") / 100).toFixed(2);
}
set amountDollars(value) {
const decimal = parseFloat(value) * 100;
this.set("unit_amount", decimal);
}
Javascript / IEEE-754 Float-Tücken:
-> parseFloat("19.99")*100
<- 1998.9999999999998
Vorgeschlagene Korrektur: const decimal = Math.round(Number(value) * 100)
Meine größte Frage: Warum ist das niemandem aufgefallen? Hat niemand zuvor den Preis auf 19,99 $ festgelegt?
2 „Gefällt mir“
pfaffman
(Jay Pfaffman)
14. Januar 2026 um 17:50
2
Ich wusste es sofort. Eine weitere Sache, die ich vor über 40 Jahren über Computer gelernt habe und die sich nicht geändert hat.
Oder 1-Cent-Ganzzahlen verwenden? Ich glaube, das macht Stripe tatsächlich. (Aber Ihre Lösung erfordert viel weniger Codeänderungen, also gewinnt sie wohl.)
2 „Gefällt mir“
RGJ
(Richard - Communiteq)
14. Januar 2026 um 17:52
3
Ja, das tut es, unit_amount sind Cents und amountDollars ist ein ‘XX.XX’-Eingabewert.
Der Fehler „ungültige Ganzzahl“ kommt sogar von der Stripe API.
Ich schätze, wir sind beide alt genug, um vom FDIV-Bug zu wissen
3 „Gefällt mir“
sam
(Sam Saffron)
15. Januar 2026 um 03:59
4
Ehrlich gesagt halte ich es für falsch, dies in einem Float zu speichern. Diese Spalte sollte ein Integer sein und in Cents gespeichert werden.
3 „Gefällt mir“
RGJ
(Richard - Communiteq)
15. Januar 2026 um 04:35
5
Es ist, das parseFloat wird verwendet, um von/zu dem Eingabefeld zu konvertieren, das „Währung mit zwei Dezimalstellen“ ist. Die Eigenschaft des unit_amount-Objekts ist offensichtlich typenlos, daher mein Vorschlag, Math.round() zu verwenden.
Es ist keine Spalte auf der Serverseite, es wird an die Stripe API übergeben.
1 „Gefällt mir“
Für die Währung BCD ist Gleitkommazahl im Allgemeinen besser als binäre Gleitkommazahl.
Danke @RGJ für den Bericht – das sollte es beheben
main ← fix/subscription-price-floating-point
opened 11:10AM - 17 Feb 26 UTC
Setting a subscription price like $19.99 would fail with "Invalid integer 1998.9… 999999999998" from the Stripe API.
Due to IEEE-754 floating point arithmetic, `parseFloat("19.99") * 100` produces `1998.9999999999998` instead of `1999`. This non-integer value is then sent directly to Stripe which rejects it.
Wrapping the multiplication in `Math.round()` ensures the result is always a proper integer before being stored as `unit_amount`.
https://meta.discourse.org/t/393466
2 „Gefällt mir“
zogstrip
Geschlossen,
23. Februar 2026 um 07:00
10
Dieses Thema wurde nach 2 Tagen automatisch geschlossen. Neue Antworten sind nicht mehr zulässig.