تعليل: هذه ليست بسبب جافاسكريبت و انما بسبب المعيار IEEE 754.
الحالة 1: تعود لطريقة تمثيل العدد الكسري في الذاكرة بما يسمى float64 و شرحته سابقاً حيث ان 0.1 + 0.2 تحسبه Js ثنائياً حسب المعيار السابق كـ 0.30000000000000004 و ليس 0.3. لذا هم لا يتساوون.
ميني ثريد :)
الحالة 1: تعود لطريقة تمثيل العدد الكسري في الذاكرة بما يسمى float64 و شرحته سابقاً حيث ان 0.1 + 0.2 تحسبه Js ثنائياً حسب المعيار السابق كـ 0.30000000000000004 و ليس 0.3. لذا هم لا يتساوون.
ميني ثريد :)
اضافة إلى ذلك فجافاسكريبت و لغات مثل Fortran و Basic حتى جافا 1.2 كانت تتبع نفس المعيار و تمثل العدد الصحيح كـfloat64 و لا تستوعب اكثر من العدد 9007199254740991 الذي يسمى في Js بـ MAX_SAFE_INTEGER فأي عددين صحيحين اكثر من ذلك تراهما متساووين. ونفس الشي ينطبق على الاعداد السالبة.
لذا تأكد قبل ان تجري عمليات على ارقام كبيرة باستخدام دالة
Number.isSafeInteger()
او استخدم الكونستركتور BigInt للارقام الكبيرة.
جافاسكريبت وضحت ذلك في مستندها specification و هذه اهمية قراءة المستندات إن كنت تتعامل مع انظمة حساسة او كنت تريد فهم اي لغة بتعمق.
Number.isSafeInteger()
او استخدم الكونستركتور BigInt للارقام الكبيرة.
جافاسكريبت وضحت ذلك في مستندها specification و هذه اهمية قراءة المستندات إن كنت تتعامل مع انظمة حساسة او كنت تريد فهم اي لغة بتعمق.
الحالة 2: في المعيار السابق و في معيار ECMA-262 الذي تتبعه Js مكتوب ان استخدام == او === مع NaN سينتج false. غير عن ذلك حتى في الرياضيات هناك اشياء مماثلة خصوصا فيما يتعلق بالتعامل مع الصفر اذا 1/0 يساوي NaN فمن غير المنطق ان يساوي ناتج 2/0 و الذي هو NaN. لذا اختبر بisNaN().
الحالة 3: ايضا ترجع للمعيار IEEE 754 فقد عرف NaN كجزء من الأنواع العددية. كلمة NaN تعني انه "ليس بعدد" معروف او يمكن تمثيله.
#Comparison_with_NaN" target="_blank" rel="noopener" onclick="event.stopPropagation()">en.wikipedia.org
#Comparison_with_NaN" target="_blank" rel="noopener" onclick="event.stopPropagation()">en.wikipedia.org
جاري تحميل الاقتراحات...