Impossible de fixer le prix de l'abonnement à 19,99 $

  • utilisation de Discourse-Subscriptions
  • en essayant d’ajouter un forfait tarifaire à un produit
  • Entrer 19,99 dans la case du prix (c’est déjà difficile car la saisie se comporte de manière très étrange)
  • Essayer de soumettre
  • Obtenir l’erreur « Entier non valide 1998.9999999999998 »

Je n’ai testé cela que sur la version stable 3.5.3 jusqu’à présent, mais le code est le même sur la version bêta.

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);
  }

La méchanceté des nombres à virgule flottante Javascript / IEEE-754 :

-> parseFloat("19.99")*100
<- 1998.9999999999998

Correction suggérée : const decimal = Math.round(Number(value) * 100)

Ma plus grande question : pourquoi personne ne l’a remarqué ? Personne n’a défini le prix à 19,99 $ auparavant ?

1 « J'aime »

Je le savais tout de suite. Encore une chose que j’ai apprise sur les ordinateurs il y a plus de 40 ans et qui n’a pas changé.

Ou utiliser des entiers au centime près ? Je pense que c’est ce que fait Stripe, en fait. (Mais votre solution nécessite de changer beaucoup moins de code, donc je suppose qu’elle gagne.)

2 « J'aime »

Oui, c’est ce qu’il fait, unit_amount sont des centimes et amountDollars est une valeur d’entrée de type « XX.XX ».
L’erreur « entier non valide » provient même de l’API Stripe.

Je suppose que nous sommes tous les deux assez âgés pour connaître le bug FDIV :wink:

2 « J'aime »