Abonnementpreis kann nicht auf $19,99 festgelegt werden

  • 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?

1 „Gefällt mir“

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“

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 :wink:

2 „Gefällt mir“