• 0

لماذا 6.35 عند تصحيحها ب toFixed() تعطينا 6.3 بينما 1.35 تعطينا 1.4

قبلها لو سمحتو اين يمكنني ان اضع مثل هاذه الاسئلة التعليمية التي الغرض منها مشاركة الفائدة اتمنى ان لا اكون خالفت الشروط .

كما درسنا في الرضيات بالنسبة لتدوير العدد العشري العدد الذي نريد تدويره عند فاصلة معينة اذا كانت أكبر من 5 يتم التدوير للاعلى واذا كانت اقل يتم التدوير للاسفل 

مثال :

alert( 1.35.toFixed(1) ); //النتيجة => 1.4

ولكن لماذا :

alert( 6.35.toFixed(1) ); // 6.3 <= النتيجة

إذن كيف يتم تدويرها بشل صحيح؟

منقول من The Modern JavaScript Tutorial 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

هذه مشكلة موجودة بالفعل فى دالة ال toFixed انها فى بعض الأحيان تقرب الرقم لأقرب رقم صحيح وأحيانا لا ويوجد بعض الحلول لذلك أولا يمكنك الإعتماد على مكاتب خارجية مثل مكتبة big.js وستقوم المكتبة بحساب القيم بطريقة صحيحة والحل الأخر يمكن أن نقوم به كالتالى :

function toFixed(n, d) {
  const tenToD = Math.pow(10, d);
  return (Math.round(n * tenToD) / tenToD).toFixed(d);
}

سنقوم بعمل الدالة الخاصة بنا لكى تعمل الدالة بطريقة صحيحة 

أولا  : سنقوم بضرب الرقم 10 فى نفسه بناءا على عدد الأرقام  التى نريد التقريب إليها بعد العلامة العشرية 

لو افترضنا الرقم سيكون 6.35 ونريد التقريب لرقم واحد بعد العلامة العشرية 

const tenToD = Math.pow(10, d);  

// tenToD = Math.pow(10, 1) =  10 * 1 = 10

إذا كنا نريد التقريب لأقرب رقمين بعد العلامة سنقوم بها كالتالى 

const tenToD = Math.pow(10, d);  

// tenToD = Math.pow(10, 2) = 10 * 10 = 100

ولكن فى تلك الحالة سنقوم بالتقريب لأقرب رقم عشرى 

const tenToD = Math.pow(10, d);  

// tenToD = Math.pow(10, 1) = 10

ومن ثم نقوم بالتقريب لأقرب رقم صحيح عن طريق إستخدام الدالة Math.round كالتالى 

Math.round(n * tenToD)
           
// n * tenToD = 6.35 * 10 = 63.5

// Math.round(63.5) = 64

ومن ثم نقوم بقسمة الناتج على عشرة 

Math.round(n * tenToD) / tenToD

// n * tenToD = 6.35 * 10 = 63.5

// Math.round(63.5) = 64 
// 64 / 10 = 6.4

وأخيرا نستخدم الدالة toFixed لحساب الرقم النهائي : 

(Math.round(n * tenToD) / tenToD).toFixed(d)
// (Math.round(63.5) / 10).toFixed(d)
// (Math.round(63.5) / 10) = 6.4
//  6.4.toFixed(1) = 6.4

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

دالة toFix  تستخدم نظام الباينري للحساب و ليس جميع الارقام يقوم تحويلها بطريقة دقيقة بعد الفاصلة العشرية مثلا 

2.34.toFixed(1)        // يرجع  '2.3'
2.35.toFixed(1)        // يرجع 2.4 اي يقوم بتقريب الى اعلى قيمة 
2.55.toFixed(1)        // يرجع 2.5 اي يقوم بتقريبها الى القيمة الاقل 

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

الدالة toFixed ليست موجهة لعمل تدوير للأعداد و إنما تقوم بعمل format بطريقة fixed point notation و هي تعيد سلسلة نصية و ليس عدد.

يُمكنك إستخدام التالي للوصول إلى ما تريد:

Number.prototype.round = function(places) {
  return +(Math.round(this + "e+" + places)  + "e-" + places);
}

// الإستخدام
1.35.round(1); // 1.4
6.35.round(1); // 6.4
52.7785.round(3); // 52.779 
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1
بتاريخ 2 ساعات قال Brahim Semmani:

ولكن بغض النظر عن الدالة وماذا عن (0.1 + 0.2) لا يساوي 0.3؟!

السبب في ذلك يعود الى التمثيل الباينري لهذه الأرقام 

حيث أنه في 0.1, 0.2 يتم تمثيلها بأرقام لا نهائية (في التمثيل الباينري لهما)

اقتباس

لتقريب الصورة: فكرة تمثيلها مماثلة لتمثيل 1/3 والتي تعتبر ...0.3333 (عدد لا نهائي من الارقام العشرية) 

لذلك عند عملية الجمع لهذان العددان اللذان تمثيلهما لا نهائي (0.1, 0.2) يجب القيام بعملية تقريب لهما

عند القيام بالتقريب سيؤدي هذا الى حصول اختلاف صغير جداً في قيمة الناتج المتوقعة (0.3)

ليكون الناتج الذي نحصل عليه من بعد عملية التقريب هو (0.30000000000000004) 

 

 

لتخلص من هذه مشكلة التمثيل اللانهائي للأرقام العشرية عليك القيام بانشاء دالة تقوم بتحديد ما اذا كانت نسبة الخطأ مقبولة أم لا

حيث يتم طرح الناتج الذي حصلنا عليه من الناتج المتوقع 

ثم نقوم بمقارنة ناتج الطرح مع نسبة الخطأ المقبولة (في حالة كانت اقل نقبل الناتج الذي حصلنا عليه)

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ 18 دقائق مضت قال عبود سمير:

الدالة toFixed ليست موجهة لعمل تدوير للأعداد و إنما تقوم بعمل format بطريقة fixed point notation و هي تعيد سلسلة نصية و ليس عدد.

يُمكنك إستخدام التالي للوصول إلى ما تريد:


Number.prototype.round = function(places) {
  return +(Math.round(this + "e+" + places)  + "e-" + places);
}

// الإستخدام
1.35.round(1); // 1.4
6.35.round(1); // 6.4
52.7785.round(3); // 52.779 

ولكن بغض النظر عن الدالة وماذا عن (0.1 + 0.2) لا يساوي 0.3؟!

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن