Impossibile impostare il prezzo dell'abbonamento a $19.99

  • utilizzando Discourse-Subscriptions
  • sto cercando di aggiungere un piano tariffario a un prodotto
  • Inserisco 19,99 nella casella del prezzo (questo è già difficile perché l’input si comporta in modo molto strano)
  • Tento di inviare
  • Ricevo l’errore “Intero non valido 1998.9999999999998”

Ho testato questo solo sulla versione stabile 3.5.3 finora, ma il codice è lo stesso sulla beta.

Codice

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

Bruttezza dei float Javascript / IEEE-754:

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

Correzione suggerita: const decimal = Math.round(Number(value) * 100)

La mia domanda più grande: perché nessuno se n’è accorto? Nessuno ha mai impostato il prezzo a $19,99 prima?

1 Mi Piace

Lo sapevo subito. Un’altra cosa che ho imparato sui computer più di 40 anni fa che non è cambiata.

O usare interi da 1 centesimo? Penso che sia quello che fa Stripe, in realtà. (Ma la tua soluzione richiede di cambiare molta meno codice, quindi immagino che vinca.)

2 Mi Piace

Sì, è quello che fa, unit_amount sono centesimi e amountDollars è un valore di input ‘XX.XX’.
L’errore “integer non valido” proviene persino dall’API di Stripe.

Immagino che entrambi siamo abbastanza grandi da conoscere il bug FDIV :wink:

2 Mi Piace