No se puede establecer el precio de la suscripción en $19.99

  • usando Discourse-Subscriptions
  • intentando añadir un plan de precios a un producto
  • Introducir 19.99 en el campo de precio (esto ya es difícil porque la entrada se comporta de forma muy extraña)
  • Intentar enviar
  • Obtener el error “Invalid integer 1998.9999999999998”

Solo he probado esto en la versión estable 3.5.3 hasta ahora, pero el código es el mismo en la beta.

Código

  @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 fealdad de los flotantes Javascript / IEEE-754:

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

Solución sugerida: const decimal = Math.round(Number(value) * 100)

Mi mayor pregunta: ¿por qué nadie se dio cuenta? ¿Nadie había establecido el precio en $19.99 antes?

1 me gusta

Lo supe de inmediato. Una cosa más que aprendí sobre las computadoras hace más de 40 años y que no ha cambiado.

¿O usar enteros de 1 centavo? Creo que eso es lo que hace Stripe, en realidad. (Pero tu solución requiere cambiar mucho menos código, así que supongo que gana).

2 Me gusta

Sí, eso es lo que hace, unit_amount son centavos y amountDollars es un valor de entrada ‘XX.XX’.
El error “integer inválido” incluso proviene de la API de Stripe.

Supongo que ambos tenemos edad suficiente para saber sobre el error FDIV :wink:

2 Me gusta