لماذا 6.35.toFixed(1) == 6.3؟
تُدَوِّر كلًا من Math.round
و toFixed
العدد إلى أقرب عدد له وفقًا للتوثيق: الأجزاء من 0..4
تُدَوَّر للأسفل، بينما الأجزاء 5..9
تثدَوَّر للأعلى.
مثلًا:
alert( 1.35.toFixed(1) ); // 1.4
في المثال المشابه أدناه، لِمَ تُدَوَّر 6.35
إلى 6.3
، وليس 6.4
؟
alert( 6.35.toFixed(1) ); // 6.3
كيف نُدَوِّر 6.35
بالطريقة الصحيحة؟
الجزء 6.35
هو عبارة عن عدد غير منتهي في الصيغة الثنائية. وكجميع الحالات المشابهة، يُخَزَّن مع ضياع في الدقة. لنرَ:
alert( 6.35.toFixed(20) ); // 6.34999999999999964473
قد يتسبب ضياع الدقة في زيادة أو نقصان أي عدد. يكون العدد في هذه الحالة أقل بقليل من قيمته الفعلية، ولهذا يُدَوَّر للأسفل. ماذا عن العدد 1.35
؟
alert( 1.35.toFixed(20) ); // 1.35000000000000008882
جعل ضياع الدقة هذا الرقم أكبر بقليل مما هو عليه مما تسبب في تقريبه للأعلى.
كيف يمكننا حل مشكلة تقريب العدد 6.35
حتى يُدَوَّر بالشكل الصحيح
يجب أن نحوله إلى عدد صحيح قبل التقريب:
alert( (6.35 * 10).toFixed(20) ); // 63.50000000000000000000
لاحظ عدم وجود أي ضياع في دقة العدد 63.5
. ذلك لأن الجزء العشري 0.5
يساوي 1/2
. يمكن تمثيل الأجزاء المقسومة على 2
تُمَثَّل بشكل صحيح في النظام الثنائي. يمكننا تقريب العدد الآن:
alert( Math.round(6.35 * 10) / 10); // 6.35 -> 63.5 -> 64(مقرب) -> 6.4