غير قادر على تعيين سعر الاشتراك إلى 19.99 دولارًا

  • استخدام Discourse-Subscriptions
  • محاولة إضافة خطة تسعير إلى منتج
  • إدخال 19.99 في خانة السعر (هذا صعب بالفعل لأن الإدخال يتصرف بغرابة شديدة)
  • محاولة الإرسال
  • الحصول على الخطأ “Invalid integer 1998.9999999999998” (عدد صحيح غير صالح 1998.9999999999998)

لقد اختبرت هذا فقط على الإصدار المستقر 3.5.3 حتى الآن، لكن الكود هو نفسه في النسخة التجريبية (beta).

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

خبث أرقام الفاصلة العائمة في جافاسكريبت / IEEE-754:

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

الحل المقترح: const decimal = Math.round(Number(value) * 100)

سؤالي الأكبر: لماذا لم يلاحظ أحد؟ ألم يقم أحد بتعيين السعر على 19.99 دولارًا من قبل؟

إعجاب واحد (1)

عرفت ذلك على الفور. شيء آخر تعلمته عن أجهزة الكمبيوتر منذ أكثر من 40 عامًا لم يتغير.

أو استخدام أعداد صحيحة بفئة 1 سنت؟ أعتقد أن هذا ما تفعله Stripe، في الواقع. (لكن حلك يتطلب تغيير قدر أقل بكثير من التعليمات البرمجية، لذا أعتقد أنه يفوز.)

إعجابَين (2)

نعم، هذا ما يفعله، unit_amount هي سنتات و amountDollars هي قيمة إدخال “XX.XX”.
خطأ “العدد الصحيح غير الصالح” يأتي حتى من واجهة برمجة تطبيقات Stripe.

أعتقد أننا كلينا كبيران بما يكفي لمعرفة خطأ FDIV :wink:

إعجابَين (2)