اذهب إلى المحتوى

السؤال

نشر

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

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

مثال :

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

ولكن لماذا :

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

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

منقول من The Modern JavaScript Tutorial 

Recommended Posts

  • 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
نشر

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

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

 

  • 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
نشر
بتاريخ 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؟!

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...