غالبًا ما تنتج الحسابات نتائج خارج النطاقات المطلوبة. ونتيجة لذلك، فمن الضروري التنفيذ تقريب جافا سكريبتحتى قيمة معينة.
لا تقوم JavaScript بتخزين الأعداد الصحيحة لأن قيمها يتم تمثيلها كأرقام فاصلة عائمة. لا يمكن تمثيل العديد من الكسور كأرقام بعدد محدود محدد من المنازل العشرية، لذلك يمكن لجافا سكريبت إنشاء نتائج مثل ما يلي:
0.1 * 0.2; > 0.020000000000000004
ومن الناحية العملية، لن يحدث هذا أي فرق منذ ذلك الحين نحن نتحدث عنحول خطأ 2 كوينتيليون. لكن هذا قد يؤثر على النتائج عند التعامل مع الأرقام التي تمثل قيم العملة أو النسب المئوية أو حجم الملف. ولذلك، عليك أن تفعل أو إلى منزلة عشرية معينة.
لقطع" عدد عشري، يتم استخدام الأساليب toFixed() أو toPrecision(). يأخذ كلاهما وسيطة واحدة، والتي تحدد عدد المنازل المهمة والعشرية التي سيتم تضمينها في النتيجة:
فار راندنوم = 6.25؛ randNum.toFixed(); > "6" Math.PI.toPrecision(1); > "3" var randNum = 87.335; randNum.toFixed(2); > "87.33" var randNum = 87.337; randNum.toPrecision(3); > "87.3"
ملحوظة
يقوم كل من toFixed() وtoPrecision بإرجاع تمثيل سلسلة مستديرة للنتيجة، بدلاً من رقم. هذا يعني أن إضافة التقريب إلى randNum سيؤدي إلى سلسلة من السلاسل بدلاً من رقم واحد:
console.log(randNum + rounded); > "6.256"
إذا كنت بحاجة للدخول نتيجة جافا سكريبتللتقريب إلى أقرب جزء من مائة من الرقم، استخدم parseFloat() :
فار راندنوم = 6.25؛ var rounded = parseFloat(randNum.toFixed(1)); console.log(rounded); > 6.3
toFixed() و toPrecision() موجودان أيضًا طرق مفيدةلاقتطاع كمية كبيرةمنازل عشرية. يكون هذا مفيدًا عند التعامل مع الأرقام التي تمثل الوحدات النقدية:
var fullNum = 1 var DollarCents = fullNum.toFixed(2); console.log(dollarsCents); > "1.00"
لاحظ أنه إذا كان الرقم يحتوي على أرقام أكثر من الدقة المحددة، فسيقوم toPrecision بإخراج النتيجة بتنسيق علمي:
var num = 123.435 num.toPrecision(2); > "1.2e+2"
في بعض الحالات، يتم تنفيذ toFixed وtoPrecision جافا سكريبت التقريب 5 لأسفل، وليس أكثر:
فار numTest = 1.005; numTest.toFixed(2); > 1؛
يجب أن تكون نتيجة المثال أعلاه 1.01، وليس 1. إذا كنت تريد تجنب هذا الخطأ، أوصي باستخدام الأرقام الأسية:
دالة مستديرة(قيمة، كسور عشرية) (إرجاع Number(Math.round(value+"e"+decimals)+"e-"+decimals); )
طلب:
جولة (1.005،2)؛ > 1.01
إذا كنت بحاجة إلى المزيد حل موثوقمن التقريب، فهو متوفر في MDN.
طريقة بديلة جافا سكريبت التقريب إلى أعشارتم تقديمه في ES6 ( المعروف أيضًا باسم جافا سكريبت 2015). « ماكينة ابسيلون"يوفر هامشًا معقولًا للخطأ عند مقارنة رقمين عائمين. وبدون التقريب، قد تؤدي المقارنات إلى نتائج مشابهة لما يلي:
0.1 + 0.2 === 0.3 > خطأ
يمكن استخدام Math.EPSILON في دالة للحصول على مقارنة صالحة:
الدالة epsEqu(x, y) ( إرجاع Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
تأخذ الدالة وسيطتين: الأول يحتوي على الحسابات، والثاني النتيجة المتوقعة (المقربة). تقوم بإرجاع مقارنة بين هاتين المعلمتين:
epsEqu(0.1 + 0.2, 0.3) > صحيح
تدعم جميع المتصفحات الحديثة وظائف الرياضيات ES6. ولكن إذا كنت بحاجة إلى تقديم الدعم في المتصفحات القديمة، فأنت بحاجة إلى استخدام polyfills.
جميع الأساليب المقدمة سابقا تؤدي جافا سكريبت التقريب إلى أعشار. لاقتطاع رقم موجب، عدد إيجابيإلى منزلتين عشريتين، اضربه في 100، ثم اقتطعه مرة أخرى، ثم قسم النتيجة على 100، ستحتاج إلى:
الدالة مبتورة(num) (إرجاع Math.trunc(num * 100) / 100;) مبتورة(3.1416) > 3.14
إذا كنت بحاجة إلى شيء أكثر مرونة، فيمكنك استخدام عامل التشغيل bitwise:
تم اقتطاع الدالة (num، decimalPlaces) ( var numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )
الاستخدام:
فار راندنت = 35.874993; اقتطاع(randInt,3); > 35.874
لتنفيذ تقريب جافا سكريبت إلى أقرب عدد صحيح، يتم استخدام Math.round() :
جولة الرياضيات (4.3) > 4 جولة الرياضيات (4.5) > 5
لاحظ أن " نصف القيم"، مثل .5، يتم تقريبها لأعلى.
إذا كنت تريد التقريب للعدد الأدنى، فاستخدم التابع Math.floor() :
Math.floor(42.23); > 42 Math.floor(36.93); > 36
التقريب للأسفل له اتجاه واحد لجميع الأرقام، بما في ذلك الأرقام السالبة. ويمكن تصور ذلك كناطحة سحاب بها عدد لا نهائي من الطوابق، بما في ذلك الطوابق التي تقع تحت مستوى الأساس ( تمثل الأرقام السالبة). إذا كنت في المصعد بين الطابق السفلي 2 و 3 ( وهو ما يتوافق مع قيمة -2.5)، سوف يأخذك Math.floor إلى الطابق -3:
Math.floor(-2.5); > -3
إذا كنت بحاجة إلى تجنب ذلك، فاستخدم تقريب JavaScript Math باستخدام Math.trunc() ، المدعوم في الكل المتصفحات الحديثة(يستثني آي إي/إيدج):
Math.trunc(-41.43); > -41
توفر MDN أيضًا ملف متعدد الخطوط من ثلاثة أسطر لتوفير الدعم لـ Math.trunc في المتصفحات القديمة وIE/Edge.
إذا كنت تريد تقريب الأرقام العشرية لأعلى، فاستخدم Math.ceil . يمكن أيضًا اعتبار هذه الطريقة بمثابة مصعد لا نهائي: يأخذك Math.ceil دائمًا إلى "الأعلى"، بغض النظر عما إذا كان الرقم سالبًا أو موجبًا:
Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil(-36.93); -36
إذا كنت بحاجة إلى تقريب قيمة إلى أقرب مضاعف للرقم 5، فقم بإنشاء دالة تقسم الرقم على 5، وتقريبه، ثم ضرب النتيجة بنفس القيمة:
دالة roundTo5(num) (إرجاع Math.round(num/5)*5;)
الاستخدام:
roundTo5(11); > 10
إذا كنت بحاجة إلى JavaScript للتقريب إلى منزلتين عشريتين، فيمكنك تمرير كل من المصدر والمضاعف إلى الوظيفة:
دالة roundToMultiple(num, multiple) (إرجاع Math.round(num/multiple)*multiple;)
لاستخدام الدالة، قم بتضمين الرقم المراد تقريبه والمضاعف في استدعائه:
فار الرقم الأولي = 11؛ فار متعدد = 10؛ roundToMultiple(initialNumber, multiple); > 10؛
لتقريب القيم لأعلى أو لأسفل فقط، استبدل round بالسقف أو الأرضية في الدالة.
في بعض الأحيان تحتاج إلى الحصول على قيمة x التي يجب أن تكون ضمن نطاق معين. على سبيل المثال، نحتاج إلى قيمة من 1 إلى 100، لكننا نحصل على القيمة 123. لإصلاح هذا يمكنك استخدام min() ( إرجاع أصغر رقم) والحد الأقصى ( إرجاع الحد الأقصى للعدد المسموح به).
الاستخدام:
فار lowBound = 1; فار هايبوند = 100؛ فار نومينبوت = 123؛ var فرضت = Math.max(lowBound, Math.min(numInput, HighBound)); console.log(clamped); > 100؛
يمكنك إنشاء دالة أو امتداد لفئة الرقم:
Number.prototype.clamp = function(min, max) ( return Math.min(Math.max(this, min), max); );
الاستخدام:
(numInput).clamp(lowBound, HighBound);
التقريب الغوسي ("الخدمات المصرفية"، متقاربة أو الهولندية) هي طريقة تقريب بدون خطأ إحصائي. معيار تقريب جافا سكريبتفي بعض الأحيان يعطي أخطاء الجانب الكبير. يتجنب التقريب الغاوسي هذا الخطأ عن طريق التقريب إلى أقرب رقم زوجي. القرار الأفضلالذي أعرفه.
في كثير من الأحيان، لا تعطي العمليات الحسابية في JavaScript النتائج التي نريدها بالضبط. بالطبع، يمكننا أن نفعل ما نريد بالأرقام - التقريب للأعلى أو للأسفل، تعيين النطاقات، قطعها أرقام غير ضروريةما يصل إلى عدد معين من المنازل العشرية، كل هذا يتوقف على ما تريد القيام به بعد ذلك مع هذا الرقم.0.1 * 0.2;
> 0.020000000000000004
0.3 - 0.1
> 0.19999999999999998
ولأغراض عملية، لا يهم عدم الدقة هذا، ففي حالتنا نحن نتحدث عن خطأ في كوينتيليون جزء، ومع ذلك، فإن هذا قد يخيب آمال البعض. يمكننا أيضًا الحصول على نتائج غريبة بعض الشيء عند العمل مع الأرقام التي تمثل العملات أو النسب المئوية أو أحجام الملفات. من أجل تصحيح هذه الأخطاء، نحتاج فقط إلى أن نكون قادرين على تقريب النتائج، ويكفي ضبط الدقة العشرية.
أرقام التقريب لديها الاستخدام العملي، ربما نتعامل مع رقم ضمن نطاق ما، على سبيل المثال، نريد تقريب القيمة إلى أقرب عدد صحيح بدلاً من العمل فقط مع الجزء العشري.
دع randNum = 6.25؛ Let rounded = randNum.toFixed(); // "6" console.log(randNum + rounded); > "6.256"
إذا كنت تريد أن تكون النتيجة نوع رقميالبيانات، فسوف تحتاج إلى تطبيق parseFloat:
دع randNum = 6.25؛ Let rounded = parseFloat(randNum.toFixed(1)); console.log(rounded); > 6.3
يرجى ملاحظة أنه يتم تقريب القيم 5 إلا في حالات نادرة.
تعد الطرق toFixed() و toPrecision() مفيدة لأنها لا تستطيع القص فقط الجزء الكسري، ولكن أيضًا لإضافة منازل عشرية، وهو أمر مناسب عند التعامل مع العملة:
دع WHOLENUM = 1 Let DollarCents = fullNum.toFixed(2); console.log(dollarsCents); > "1.00"
لاحظ أن toPrecision سينتج النتيجة بالترميز العلمي إذا كان عدد الأعداد الصحيحة أكبر من الدقة نفسها:
دع الأعداد = 123.435 num.toPrecision(2); > "1.2e+2"
دع numTest = 1.005؛ numTest.toFixed(2); > "1.00"
يجب أن تكون نتيجة الحساب أعلاه 1.01، وليس 1. إذا كنت ترغب في تجنب خطأ مماثل، يمكننا استخدام الحل الذي اقترحه جاك إل مور، والذي يستخدم الأرقام الأسية للحساب:
دالة دائرية(قيمة، كسور عشرية) (إرجاع Number(Math.round(value+"e"+decimals)+"e-"+decimals);)
الآن:
جولة (1.005،2)؛ > 1.01
إذا كنت تريد حلاً أكثر قوة من الحل الموضح أعلاه، فيمكنك الانتقال إلى MDN.
0.1 + 0.2 === 0.3 > خطأ
نستخدم Math.EPSILON في وظيفتنا للحصول على مقارنة صحيحة:
الدالة epsEqu(x, y) ( إرجاع Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y));
}
تأخذ الدالة وسيطتين: الأولى هي الحساب الحالي، والثانية هي النتيجة المتوقعة. تقوم بإرجاع المقارنة بين الاثنين:
EpsEqu(0.1 + 0.2, 0.3) > صحيح
تدعم جميع المتصفحات الحديثة بالفعل وظائف الرياضيات ES6، ولكن إذا كنت تريد الدعم في متصفحات مثل IE 11، فاستخدم polyfills.
الدالة مبتورة(num) (إرجاع Math.trunc(num * 100) / 100;) مبتورة(3.1416) > 3.14
إذا كنت تريد تكييف الطريقة مع أي عدد من المنازل العشرية، فيمكنك استخدام النفي المزدوج للبت:
تم اقتطاع الدالة (num، decimalPlaces) ( Let numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )
الآن:
دع randInt = 35.874993؛ اقتطاع(randInt,3); > 35.874
جولة الرياضيات (4.3) > 4 جولة الرياضيات (4.5) > 5
يرجى ملاحظة أن "نصف القيمة"، 0.5 يتم تقريبها وفقًا لقواعد الرياضيات.
Math.floor(42.23); > 42 Math.floor(36.93); > 36
يرجى ملاحظة أن التقريب للأسفل يعمل مع كافة الأرقام، بما في ذلك الأرقام السالبة. تخيل ناطحة سحاب بها عدد لا نهائي من الطوابق، بما في ذلك طوابق الطابق السفلي (تمثل أرقامًا سالبة). إذا كنت في المصعد المستويات الدنيابين 2 و3 (والتي تمثل قيمة -2.5)، ستأخذك Math.floor إلى -3:
Math.floor(-2.5); > -3
ولكن إذا كنت تريد تجنب حالة مماثلة، استخدم Math.trunc، المدعوم في جميع المتصفحات الحديثة (باستثناء IE/Edge):
Math.trunc(-41.43); > -41
ستجد في MDN ملف polyfill الذي سيوفر الدعم لـ Math.trunc في المتصفحات وIE/Edge.
Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil(-36.93); > -36
الدالة roundTo5(num) (إرجاع Math.round(num/5)*5;)
الآن:
RoundTo5(11); > 10
إذا كنت تريد التقريب إلى مضاعفات القيمة الخاصة بك، فإننا نستخدم المزيد وظيفة عامة، المرور فيه القيمة البدائيةومتعددة:
الدالة roundToMultiple(num, multiple) (إرجاع Math.round(num/multiple)*multiple;)
الآن:
دع الرقم الأولي = 11؛ دع المتعدد = 10؛ roundToMultiple(initialNumber, multiple); > 10؛
Let lowBound = 1; دع HighBound = 100؛ دع numInput = 123؛ دع فرضت = Math.max(lowBound, Math.min(numInput, HighBound)); console.log(clamped); > 100؛
مرة أخرى، يمكننا إعادة استخدام العملية ولف كل شيء في دالة، باستخدام الحل الذي اقترحه دانييل إكس مور:
Number.prototype.clamp = function(min, max) ( return Math.min(Math.max(this, min), max); );
الآن:
NumInput.clamp(lowBound, HighBound); > 100؛
الدالة gaussRound(num, decimalPlaces) ( Let d = decimalPlaces || 0, m = Math.pow(10, d), n = +(d ? num * m: num).toFixed(8), i = Math.floor (ن)، و = ن - أنا، ه = 1e-8، ص = (و > 0.5 - ه && f< 0.5 + e) ?
((i % 2 == 0) ? i: i + 1) : Math.round(n);
return d ? r / m: r;
}
الآن:
غاوس راوند (2.5) > 2 غاوس راوند (3.5) > 4 غاوس راوند (2.57،1) > 2.6
العلامة العشرية في CSS:
نظرًا لأن JavaScript يُستخدم غالبًا لإنشاء تعيينات موضعية لعناصر HTML، فقد تتساءل عما سيحدث إذا أنشأنا قيمًا عشرية لعناصرنا:
#box (العرض: 63.667731993 بكسل;)
والخبر السار هو أن المتصفحات الحديثة سوف تحترم القيم العشرية في نموذج الكتلة، بما في ذلك النسبة المئوية أو وحدات البكسل.
دع الفاكهة = ["قرع الجوز"، "مشمش"، "شمام"]؛ Fruit.sort(); > "مشمش"، "قرع الجوز"، "شمام"]
ومع ذلك، فإننا نواجه مشكلة بمجرد أن يكون أحد العناصر كبيرًا:
دع الفاكهة = ["قرع الجوز"، "المشمش"، "الشمام"]؛ Fruit.sort(); > "الشمام"، "المشمش"، "قرع الجوز"]
وذلك لأن أداة الفرز، بشكل افتراضي، تقوم بمقارنة الحرف الأول الممثل في Unicode. Unicode هو رمز فريد لأي شخصية، بغض النظر عن النظام الأساسي، بغض النظر عن البرنامج، بغض النظر عن اللغة. على سبيل المثال، إذا نظرت إلى جدول الرموز، فإن الحرف "a" له القيمة U+0061 (في نظام سداسي عشري 0x61)، في حين أن الحرف "C" لديه الرمز U+0043 (0x43)، والذي يأتي في جدول Unicode أقدم من الحرف "a".
لفرز مصفوفة قد تحتوي على أحرف أولى مختلطة، نحتاج إما إلى تحويل جميع العناصر مؤقتًا إلى أحرف صغيرة، أو تحديد ترتيب الفرز باستخدام الأسلوب localeCompare() مع بعض الوسائط. كقاعدة عامة، في مثل هذه الحالة، من الأفضل إنشاء وظيفة للاستخدام المتكرر على الفور:
الدالة alphaSort(arr) ( arr.sort(function (a, b) ( return a.localeCompare(b, "en", ("sensitivity": "base")); )); ) دع الفاكهة = ["قرع الجوز" "، "مشمش"، "شمام"]؛ ترتيب ألفا (الفاكهة)>
إذا كنت ترغب في الحصول على مصفوفة مرتبة عكسيًا ترتيب ابجدي، فقط قم بتبديل موضعي a و b في الوظيفة:
الدالة alphaSort(arr) ( arr.sort(function (a, b) ( return b.localeCompare(a, "en", ("sensitivity": "base")); )); ) دع الفاكهة = ["قرع الجوز" "، "مشمش"، "شمام"]؛ alphaSort(فاكهة) > ["الشمام"، "قرع الجوز"، "المشمش"]
تجدر الإشارة هنا إلى أن localeCompare يُستخدم مع الوسائط، وعلينا أيضًا أن نتذكر أنه مدعوم من IE11+، بالنسبة للإصدارات الأقدم من IE، يمكننا استخدامه بدون وسائط، وبالأحرف الصغيرة:
الدالة caseSort(arr) ( arr.sort(function (a, b) ( return a.toLowerCase().localeCompare(b.toLowerCase()); )); ) Let Fruit = ["قرع الجوز"، "المشمش"، "الشمام"]؛ caseSort(fruit) > ["مشمش"، "قرع الجوز"، "شمام"]
دع أعلى الدرجات = ; HighScores.sort(); >
الأمر هو أن طريقة الترتيب () تقوم بإجراء مقارنة معجمية: مما يعني أنه سيتم تحويل الأرقام إلى سلسلة وسيتم إجراء المقارنات مرة أخرى عن طريق مطابقة الحرف الأول من تلك السلسلة بترتيب الأحرف في جدول Unicode . ولذلك، نحن بحاجة مرة أخرى إلى تحديد ترتيب الفرز لدينا:
دع أعلى الدرجات = ; HighScores.sort(function(a,b) ( return a - b; )); >
مرة أخرى، لفرز الأرقام إلى ترتيب عكسي، قم بتبديل موضعي a و b في الوظيفة.
دع الدرجات = [ ( "الاسم": "دانيال"، "النتيجة": 21768)، ( "الاسم": "مايكل"، "النتيجة": 33579)، ( "الاسم": "أليسون"، "النتيجة": 38395 )];
في ES6+، يمكنك استخدام وظائف الأسهم:
Scores.sort((a, b) => b.score - a.score));
بالنسبة للمتصفحات الأقدم التي لا تتمتع بهذا الدعم:
Scores.sort(function(a, b) ( return a.score - b.score ));
كما ترون، يعد الفرز في JavaScript أمرًا غامضًا إلى حد ما، وآمل أن تجعل هذه الأمثلة الحياة أسهل بطريقة ما.
في JavaScript، يتم تمثيل دالة الطاقة كـ Math.pow()، وقد تم تقديمها في معيار ES7 الجديد مشغل جديدالأس - " * * ".
Math.pow(3,2) > 9
هذا الشكل من الترميز يعني 3 تربيع، أو 3 × 3، مما يؤدي إلى النتيجة 9. ويمكن إعطاء مثال آخر بالطبع:
Math.pow(5,3); > 125
أي أن 5 مكعبًا، أو 5 × 5 × 5، يساوي 125.
ECMAScript 7 هو التالي نسخة جافا سكريبت، من حيث المبدأ، يمكننا استخدام عامل الأسي الجديد المقترح - * *، قد يكون هذا الشكل من التدوين أكثر وصفيًا:
3 ** 2
> 9
على هذه اللحظةدعم هذا المشغل محدود للغاية، لذلك لا ينصح باستخدامه.
يمكن أن تكون وظيفة الطاقة مفيدة في أغلب الأحيان حالات مختلفة. مثال بسيط لحساب عدد الثواني في الساعة: Math.pow (60,2).
الرياضيات.sqrt(9) > 3
وفي الوقت نفسه، الجذر التكعيبي لـ a هو الرقم الذي يعطي s عند رفعه إلى مكعب.
الرياضيات.cbrt(125) > 5
تم إدخال Math.cbrt() مؤخرًا في مواصفات JavaScript، وبالتالي فهو مدعوم فقط في المتصفحات الحديثة: Chrome 38+ وFirefox وOpera 25+ وSafari 7.1+. ستلاحظ ذلك متصفح الانترنتليس في هذه القائمة، ولكنك ستجد polyfill على MDN.
Math.pow(1.25, 2); > 1.5625 Math.cbrt(56.57) > 3.8387991760286138
يرجى ملاحظة أن هذا يعمل بشكل جيد عند الاستخدام القيم السلبيةالحجج:
Math.pow(-5,2) > 25 Math.pow(10,-2) > 0.01
ومع ذلك، لن ينجح هذا مع الجذر التربيعي:
Math.sqrt(-9) > NaN
من التحليل الرياضينحن نعلم أننا نعني بالعدد التخيلي الجذور التربيعية للأعداد السالبة. وهذا قد يقودنا إلى أسلوب آخر للتعامل مع الأعداد المركبة، لكن تلك قصة أخرى.
يمكنك استخدام القيم الكسرية في Math.pow() للعثور على المربع و جذور مكعبةأعداد. الجذر التربيعييستخدم الأس 0.5:
Math.pow(5, 0.5); // = Math.sqrt(5) = 5 ** (1/2) > 2.23606797749979
ومع ذلك، نظرًا لتقلبات النقطة العائمة، لا يمكنك تخمين النتيجة الصحيحة تمامًا:
Math.pow(2.23606797749979,2) > 5.000000000000001
في مثل هذه الحالات، سيتعين عليك اللجوء إلى قطع العلامات من الرقم أو التقريب إلى بعض القيمة.
يخلط بعض الأشخاص، لأسباب غير معروفة، في JavaScript بين الدالة Math.pow() وMath.exp()، وهي الدالة الأسية للأرقام بشكل عام. ملاحظة: في اللغة الإنجليزيةتتم ترجمة "الأس" على أنها "الأس"، لذلك من المرجح أن ينطبق هذا على المتحدثين باللغة الإنجليزية، على الرغم من وجود أسماء بديلة للأس، مثل الفهرس، والقوة.
يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع. ، لو سمحت.
العلامات: إضافة علامات في كثير من الأحيان، لا تعطي العمليات الحسابية في JavaScript النتائج التي نريدها بالضبط. بالطبع، يمكننا أن نفعل ما نريد بالأرقام - التقريب لأعلى أو لأسفل، وتعيين النطاقات، وقطع الأرقام غير الضرورية إلى عدد معين من المنازل العشرية، كل هذا يتوقف على ما تريد القيام به بهذا الرقم في المستقبل.0.1 * 0.2;
> 0.020000000000000004
0.3 - 0.1
> 0.19999999999999998
ولأغراض عملية، لا يهم عدم الدقة هذا، ففي حالتنا نحن نتحدث عن خطأ في كوينتيليون جزء، ومع ذلك، فإن هذا قد يخيب آمال البعض. يمكننا أيضًا الحصول على نتائج غريبة بعض الشيء عند العمل مع الأرقام التي تمثل العملات أو النسب المئوية أو أحجام الملفات. من أجل تصحيح هذه الأخطاء، نحتاج فقط إلى أن نكون قادرين على تقريب النتائج، ويكفي ضبط الدقة العشرية.
لتقريب الأرقام تطبيقات عملية، حيث يمكننا التعامل مع رقم ضمن نطاق معين، على سبيل المثال نريد تقريب قيمة إلى أقرب رقم صحيح بدلاً من العمل فقط مع الجزء العشري.
دع randNum = 6.25؛ Let rounded = randNum.toFixed(); // "6" console.log(randNum + rounded); > "6.256"
إذا كنت تريد أن تكون النتيجة نوع بيانات رقمي، فستحتاج إلى استخدام parseFloat:
دع randNum = 6.25؛ Let rounded = parseFloat(randNum.toFixed(1)); console.log(rounded); > 6.3
يرجى ملاحظة أنه يتم تقريب القيم 5 إلا في حالات نادرة.
تُعد التابعتان toFixed() وtoPrecision() مفيدة لأنهما لا تستطيعان قطع الجزء الكسري فحسب، بل تضيفان أيضًا منازل عشرية، وهو أمر مناسب عند التعامل مع العملة:
دع WHOLENUM = 1 Let DollarCents = fullNum.toFixed(2); console.log(dollarsCents); > "1.00"
لاحظ أن toPrecision سينتج النتيجة بالترميز العلمي إذا كان عدد الأعداد الصحيحة أكبر من الدقة نفسها:
دع الأعداد = 123.435 num.toPrecision(2); > "1.2e+2"
دع numTest = 1.005؛ numTest.toFixed(2); > "1.00"
يجب أن تكون نتيجة الحساب أعلاه 1.01، وليس 1. إذا كنت ترغب في تجنب خطأ مماثل، يمكننا استخدام الحل الذي اقترحه جاك إل مور، والذي يستخدم الأرقام الأسية للحساب:
دالة دائرية(قيمة، كسور عشرية) (إرجاع Number(Math.round(value+"e"+decimals)+"e-"+decimals);)
الآن:
جولة (1.005،2)؛ > 1.01
إذا كنت تريد حلاً أكثر قوة من الحل الموضح أعلاه، فيمكنك الانتقال إلى MDN.
0.1 + 0.2 === 0.3 > خطأ
نستخدم Math.EPSILON في وظيفتنا للحصول على مقارنة صحيحة:
الدالة epsEqu(x, y) ( إرجاع Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y));
}
تأخذ الدالة وسيطتين: الأولى هي الحساب الحالي، والثانية هي النتيجة المتوقعة. تقوم بإرجاع المقارنة بين الاثنين:
EpsEqu(0.1 + 0.2, 0.3) > صحيح
تدعم جميع المتصفحات الحديثة بالفعل وظائف الرياضيات ES6، ولكن إذا كنت تريد الدعم في متصفحات مثل IE 11، فاستخدم polyfills.
الدالة مبتورة(num) (إرجاع Math.trunc(num * 100) / 100;) مبتورة(3.1416) > 3.14
إذا كنت تريد تكييف الطريقة مع أي عدد من المنازل العشرية، فيمكنك استخدام النفي المزدوج للبت:
تم اقتطاع الدالة (num، decimalPlaces) ( Let numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )
الآن:
دع randInt = 35.874993؛ اقتطاع(randInt,3); > 35.874
جولة الرياضيات (4.3) > 4 جولة الرياضيات (4.5) > 5
يرجى ملاحظة أن "نصف القيمة"، 0.5 يتم تقريبها وفقًا لقواعد الرياضيات.
Math.floor(42.23); > 42 Math.floor(36.93); > 36
يرجى ملاحظة أن التقريب للأسفل يعمل مع كافة الأرقام، بما في ذلك الأرقام السالبة. تخيل ناطحة سحاب بها عدد لا نهائي من الطوابق، بما في ذلك طوابق الطابق السفلي (تمثل أرقامًا سالبة). إذا كنت في المصعد في أدنى مستوى بين 2 و 3 (والذي يمثل قيمة -2.5)، فسوف يأخذك Math.floor إلى -3:
Math.floor(-2.5); > -3
ولكن إذا كنت تريد تجنب هذا الموقف، فاستخدم Math.trunc، المدعوم في جميع المتصفحات الحديثة (باستثناء IE/Edge):
Math.trunc(-41.43); > -41
ستجد في MDN ملف polyfill الذي سيوفر الدعم لـ Math.trunc في المتصفحات وIE/Edge.
Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil(-36.93); > -36
الدالة roundTo5(num) (إرجاع Math.round(num/5)*5;)
الآن:
RoundTo5(11); > 10
إذا كنت تريد التقريب إلى مضاعفات القيمة الخاصة بك، فإننا نستخدم دالة أكثر عمومية، حيث نقوم بتمرير القيمة الأولية والمضاعف:
الدالة roundToMultiple(num, multiple) (إرجاع Math.round(num/multiple)*multiple;)
الآن:
دع الرقم الأولي = 11؛ دع المتعدد = 10؛ roundToMultiple(initialNumber, multiple); > 10؛
Let lowBound = 1; دع HighBound = 100؛ دع numInput = 123؛ دع فرضت = Math.max(lowBound, Math.min(numInput, HighBound)); console.log(clamped); > 100؛
مرة أخرى، يمكننا إعادة استخدام العملية ولف كل شيء في دالة، باستخدام الحل الذي اقترحه دانييل إكس مور:
Number.prototype.clamp = function(min, max) ( return Math.min(Math.max(this, min), max); );
الآن:
NumInput.clamp(lowBound, HighBound); > 100؛
الدالة gaussRound(num, decimalPlaces) ( Let d = decimalPlaces || 0, m = Math.pow(10, d), n = +(d ? num * m: num).toFixed(8), i = Math.floor (ن)، و = ن - أنا، ه = 1e-8، ص = (و > 0.5 - ه && f< 0.5 + e) ?
((i % 2 == 0) ? i: i + 1) : Math.round(n);
return d ? r / m: r;
}
الآن:
غاوس راوند (2.5) > 2 غاوس راوند (3.5) > 4 غاوس راوند (2.57،1) > 2.6
العلامة العشرية في CSS:
نظرًا لأن JavaScript يُستخدم غالبًا لإنشاء تعيينات موضعية لعناصر HTML، فقد تتساءل عما سيحدث إذا أنشأنا قيمًا عشرية لعناصرنا:
#box (العرض: 63.667731993 بكسل;)
والخبر السار هو أن المتصفحات الحديثة ستحترم القيم العشرية في نموذج الكتلة، بما في ذلك النسبة المئوية أو وحدات البكسل.
دع الفاكهة = ["قرع الجوز"، "مشمش"، "شمام"]؛ Fruit.sort(); > "مشمش"، "قرع الجوز"، "شمام"]
ومع ذلك، فإننا نواجه مشكلة بمجرد أن يكون أحد العناصر كبيرًا:
دع الفاكهة = ["قرع الجوز"، "المشمش"، "الشمام"]؛ Fruit.sort(); > "الشمام"، "المشمش"، "قرع الجوز"]
وذلك لأن أداة الفرز، بشكل افتراضي، تقوم بمقارنة الحرف الأول الممثل في Unicode. Unicode هو رمز فريد لأي شخصية، بغض النظر عن النظام الأساسي، بغض النظر عن البرنامج، بغض النظر عن اللغة. على سبيل المثال، إذا نظرت إلى جدول الرموز، فإن الحرف "a" له القيمة U+0061 (بالنظام الست عشري 0x61)، في حين أن الحرف "C" له الرمز U+0043 (0x43)، والذي يأتي سابقًا في Unicode الجدول من الحرف "أ".
لفرز مصفوفة قد تحتوي على أحرف أولى مختلطة، نحتاج إما إلى تحويل جميع العناصر مؤقتًا إلى أحرف صغيرة، أو تحديد ترتيب الفرز باستخدام الأسلوب localeCompare() مع بعض الوسائط. كقاعدة عامة، في مثل هذه الحالة، من الأفضل إنشاء وظيفة للاستخدام المتكرر على الفور:
الدالة alphaSort(arr) ( arr.sort(function (a, b) ( return a.localeCompare(b, "en", ("sensitivity": "base")); )); ) دع الفاكهة = ["قرع الجوز" "، "مشمش"، "شمام"]؛ ترتيب ألفا (الفاكهة)>
إذا كنت تريد ترتيب المصفوفة بترتيب أبجدي عكسي، فما عليك سوى تبديل موضعي a وb في الدالة:
الدالة alphaSort(arr) ( arr.sort(function (a, b) ( return b.localeCompare(a, "en", ("sensitivity": "base")); )); ) دع الفاكهة = ["قرع الجوز" "، "مشمش"، "شمام"]؛ alphaSort(فاكهة) > ["الشمام"، "قرع الجوز"، "المشمش"]
تجدر الإشارة هنا إلى أن localeCompare يُستخدم مع الوسائط، وعلينا أيضًا أن نتذكر أنه مدعوم من IE11+، بالنسبة للإصدارات الأقدم من IE، يمكننا استخدامه بدون وسائط، وبالأحرف الصغيرة:
الدالة caseSort(arr) ( arr.sort(function (a, b) ( return a.toLowerCase().localeCompare(b.toLowerCase()); )); ) Let Fruit = ["قرع الجوز"، "المشمش"، "الشمام"]؛ caseSort(fruit) > ["مشمش"، "قرع الجوز"، "شمام"]
دع أعلى الدرجات = ; HighScores.sort(); >
الأمر هو أن طريقة الترتيب () تقوم بإجراء مقارنة معجمية: مما يعني أنه سيتم تحويل الأرقام إلى سلسلة وسيتم إجراء المقارنات مرة أخرى عن طريق مطابقة الحرف الأول من تلك السلسلة بترتيب الأحرف في جدول Unicode . ولذلك، نحن بحاجة مرة أخرى إلى تحديد ترتيب الفرز لدينا:
دع أعلى الدرجات = ; HighScores.sort(function(a,b) ( return a - b; )); >
مرة أخرى، لفرز الأرقام بترتيب عكسي، قم بتبديل موضعي a وb في الدالة.
دع الدرجات = [ ( "الاسم": "دانيال"، "النتيجة": 21768)، ( "الاسم": "مايكل"، "النتيجة": 33579)، ( "الاسم": "أليسون"، "النتيجة": 38395 )];
في ES6+، يمكنك استخدام وظائف الأسهم:
Scores.sort((a, b) => b.score - a.score));
بالنسبة للمتصفحات الأقدم التي لا تتمتع بهذا الدعم:
Scores.sort(function(a, b) ( return a.score - b.score ));
كما ترون، يعد الفرز في JavaScript أمرًا غامضًا إلى حد ما، وآمل أن تجعل هذه الأمثلة الحياة أسهل بطريقة ما.
في JavaScript، يتم تمثيل دالة الطاقة كـ Math.pow()، وفي معيار ES7 الجديد، تم تقديم عامل أسي جديد - " * * ".
Math.pow(3,2) > 9
هذا الشكل من الترميز يعني 3 تربيع، أو 3 × 3، مما يؤدي إلى النتيجة 9. ويمكن إعطاء مثال آخر بالطبع:
Math.pow(5,3); > 125
أي أن 5 مكعبًا، أو 5 × 5 × 5، يساوي 125.
ECMAScript 7 هو الإصدار التاليجافا سكريبت، من حيث المبدأ، يمكننا استخدام عامل الأسي الجديد المقترح - * *، قد يكون هذا الشكل من التدوين أكثر وصفيًا:
3 ** 2
> 9
في الوقت الحالي، دعم هذا المشغل محدود للغاية، لذلك لا ينصح باستخدامه.
يمكن أن تكون وظيفة الطاقة مفيدة في مجموعة متنوعة من المواقف. مثال بسيط لحساب عدد الثواني في الساعة: Math.pow (60,2).
الرياضيات.sqrt(9) > 3
وفي الوقت نفسه، الجذر التكعيبي لـ a هو الرقم الذي يعطي s عند رفعه إلى مكعب.
الرياضيات.cbrt(125) > 5
تم إدخال Math.cbrt() مؤخرًا في مواصفات JavaScript، وبالتالي فهو مدعوم فقط في المتصفحات الحديثة: Chrome 38+ وFirefox وOpera 25+ وSafari 7.1+. ستلاحظ أن Internet Explorer غير موجود في هذه القائمة، ولكنك ستجد ملف polyfill على MDN.
Math.pow(1.25, 2); > 1.5625 Math.cbrt(56.57) > 3.8387991760286138
يرجى ملاحظة أن هذا يعمل جيدًا أيضًا عند استخدام قيم الوسائط السالبة:
Math.pow(-5,2) > 25 Math.pow(10,-2) > 0.01
ومع ذلك، لن ينجح هذا مع الجذر التربيعي:
Math.sqrt(-9) > NaN
نعلم من التحليل الرياضي أن الرقم التخيلي يشير إلى الجذور التربيعية للأعداد السالبة. وهذا قد يقودنا إلى أسلوب آخر للتعامل مع الأعداد المركبة، لكن تلك قصة أخرى.
يمكنك استخدام الكسور في Math.pow() للعثور على الجذور التربيعية والتكعيبية للأرقام. يستخدم الجذر التربيعي الأس 0.5:
Math.pow(5, 0.5); // = Math.sqrt(5) = 5 ** (1/2) > 2.23606797749979
ومع ذلك، نظرًا لتقلبات النقطة العائمة، لا يمكنك تخمين النتيجة الصحيحة تمامًا:
Math.pow(2.23606797749979,2) > 5.000000000000001
في مثل هذه الحالات، سيتعين عليك اللجوء إلى قطع العلامات من الرقم أو التقريب إلى بعض القيمة.
يخلط بعض الأشخاص، لأسباب غير معروفة، في JavaScript بين الدالة Math.pow() وMath.exp()، وهي الدالة الأسية للأرقام بشكل عام. ملاحظة: في اللغة الإنجليزية، يتم ترجمة كلمة "الأس" على أنها "الأس"، لذلك من المرجح أن ينطبق هذا على المتحدثين باللغة الإنجليزية، على الرغم من وجود أسماء بديلة للأس، مثل الفهرس، والقوة.
يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع. ادخل من فضلك.
العلامات:مرحبًا عشاق جافا سكريبت. لقد لاحظت بالفعل أن هذه اللغة غير عادية للغاية وتتميز في كل قسم بخصائصها الفريدة وغير العادية الحلول التقنية. لذلك، تم تخصيص منشور اليوم لموضوع: "تقريب جافا سكريبت".
بعد قراءة المقالة الحالية، سوف تتعلم لماذا تحتاج إلى تقريب الأرقام، وما هي الأساليب والخصائص في JS التي تؤدي هذه الوظيفة، وأيضًا لماذا تبرز القسمة على 0. دون تغيير مبادئي، سأرفق أمثلة على ذلك النقاط الرئيسيةالمواد ووصف كل إجراء بالتفصيل. الآن دعونا نبدأ التعلم!
أولاً، تذكر أنه في JS، تنتمي جميع أنواع الأرقام (الكسور والأعداد الصحيحة) إلى النوع رقم. بالإضافة إلى ذلك، فهي جميعها 64 بت، حيث يتم تخزينها بتنسيق "الدقة المزدوجة"، المعروف أيضًا باسم معيار IEEE-754.
يتم إنشاء المتغيرات الرقمية بالطريقة المعتادة:
فار خدر = 35؛ // عدد طبيعي
فار دروب = 0.93؛ // التمثيل العشري
فار numb16 = 0xFF; // نظام الأرقام السداسية العشرية
يدعم التمثيلات الرقمية الأخرى. لذلك، يمكنك أيضًا إنشاء أرقام الفاصلة العائمة (وتسمى أحيانًا "الأرقام العلمية").
كان هناك الكثير من الدعم طريقة مثيرة للاهتمام toLocaleString()، والذي يقوم بتنسيق جميع المعلمات الرقمية وفقًا للمواصفات المنصوص عليها في ECMA 402. وبفضل هذا، يتم إنشاء أعداد كبيرة، أرقام الهواتفويتم عرض العملات وحتى النسب المئوية بشكل جميل في مربع الحوار.
فار نوم = 714000.80;
تنبيه (num.toLocaleString ())؛
للعمل مع عناصر من النوع الرقمي، تم توفير كائن عالمي كامل مع مجموعة من العناصر المتنوعة وظائف رياضية، اسم من الرياضيات.
وبصرف النظر عن هذا، هناك طرق أخرى تؤدي التقريب القيم العدديةحتى الأعداد الصحيحة، وحتى الأعشار، والمئات، وما إلى ذلك. دعونا ننظر إليهم جميعا بمزيد من التفصيل.
يتضمن كائن الرياضيات العالمي كمية كبيرةرياضية و مختلفة الدوال المثلثية. هذا جدا الكائن المطلوبوغالبًا ما يساعد المطورين عند العمل مع البيانات الرقمية.
هناك نظائرها للرياضيات على منصات أخرى. على سبيل المثال، في مثل هذا اللغات الشعبيةمثل Java وC#، فإن Math هي فئة تدعم نفس الشيء الميزات القياسية. لذا، كما ترون، هذه الأداة رائعة وقوية حقًا.
الآن أريد أن أستعرض الطرق المحددة المسؤولة عن التقريب وأتحدث عنها بالتفصيل.
سأبدأ مع الرياضيات.أرضية. انتبه إلى اسم الطريقة. منطقيا يصبح واضحا أنه بما أننا نتحدث عن التقريب، والترجمة الحرفية لكلمة "الأرضية" تعني "الأرضية"، إذن هذه الأداةسيتم تقريب القيم المعالجة لأسفل.
ومن الممكن أيضًا أن يظل الرقم الذي تمت معالجته باستخدام هذه الوظيفة كما هو. وذلك لأن التقريب يتم وفقًا لمتباينة غير صارمة (<=). Таким образом, при отработке этой строчки кода:
تنبيه(Math.floor(4.5));
الجواب سيكون رقم 4
انظر مرة أخرى إلى الاسم (بهذه الطريقة يتم امتصاص المادة بشكل أسرع). إذا كان أي شخص لا يعرف، "السقف" تعني "السقف". وهذا يعني أنه سيتم تقريب البيانات الرقمية باستخدام متباينة غير صارمة (>=).
تنبيه(Math.ceil(4.5));
كما كنت قد خمنت، فإن الجواب سيكون الرقم 5.
هذه الطريقة تدور رقم كسريإلى أقرب عدد صحيح. لذلك، إذا كان الجزء الكسري يقع في النطاق من 0 إلى 0.5 غير شامل، فسيتم التقريب إلى قيمة أصغر. وإذا كان الجزء الكسري يقع في النطاق من 0.5 إلى الرقم الصحيح التالي، فسيتم تقريبه إلى رقم صحيح أكبر.
تنبيه(Math.round(4.5));
أتمنى أن الجميع فكر أو قال أن الإجابة الصحيحة هي 5.
لدى JavaScript أيضًا طريقتان أخريان تتعاملان مع تقريب التمثيلات الرقمية. ومع ذلك، فهي مختلفة بعض الشيء.
سنتحدث عن أدوات مثل للتصليح()و إلى الدقة (). إنهم مسؤولون ليس فقط عن التقريب، ولكن أيضًا عن دقته بالنسبة لأحرف معينة. دعونا نحفر أعمق.
باستخدام هذه الآليةيمكنك تحديد عدد المنازل العشرية التي يجب تقريب القيمة إليها. تقوم الطريقة بإرجاع النتيجة كسلسلة. لقد أرفقت أدناه خيارًا بثلاثة خيارات مختلفة. تحليل الردود الواردة.
فار نوم = 5656.9393؛
document.writeln(num.toFixed()); // 5657
document.writeln(num.toFixed(2)); // 5656.94
document.writeln(num.toFixed(7)); // 5656.9393000
كما ترى، إذا لم تحدد وسيطة، فسوف يقوم toFixed ()) بتقريب القيمة الكسرية على العمومأعداد. يتم تقريب السطر الثالث ما يصل إلى حرفين،وفي الرابع، بسبب المعلمة "7"، تمت إضافة ثلاثة أصفار أخرى.
تعمل هذه الطريقة بشكل مختلف قليلاً. بدلاً من الوسيطة، يمكنك إما ترك مساحة فارغة أو تعيين معلمة. ومع ذلك، سيقوم الأخير بتقريب الأرقام إلى العدد المحدد من الأرقام، بغض النظر عن الفاصلة. فيما يلي النتائج التي ينتجها البرنامج، معاد كتابتها من المثال السابق:
فار نوم = 5656.9393؛
document.writeln(num.toPrecision()); // 5656.9393
document.writeln(num.toPrecision(2)); // 5.7e+3
document.writeln(num.toPrecision(7)); // 5656.939
كما تعلم من دروس الرياضيات، لا يمكنك القسمة على صفر. تم أخذ هذه القاعدة كأساس من قبل معظم منشئي لغات البرمجة. لذلك، عند القسمة على الصفر، تولد كافة البرامج خطأ.
ومع ذلك، جافا سكريبت تتفوق هنا أيضا. لذلك، أثناء تنفيذ مثل هذه العملية، لا تظهر أي رسائل خطأ... لأن مثل هذه العملية تعود "ما لا نهاية"!
لماذا هو كذلك؟ وكما هو معروف من نفس العلوم الرياضية، كلما صغر المقسوم عليه، كان الناتج أكبر. ولهذا السبب قرر مبتكرو هذه اللغة الموجهة نحو النموذج الأولي التخلي عن القوالب والسير في طريقهم الخاص.
بالنسبة لأولئك الذين يواجهون قيمة Infinity لأول مرة، قمت بشرح ميزاتها أدناه.
اللانهاية - تعني اللانهاية وتتوافق تمامًا علامة رياضية ∞.
قد تكون سلبية. يتم حفظ الجميع أيضًا القواعد القياسيةالعمل مع العوامل الحسابية.
تنبيه(12/0); //ما لا نهاية
تنبيه (12.34/ 0)؛ // ما لا نهاية
تنبيه (-3/ 0)؛ // -ما لا نهاية
أعتقد أنني سأنتهي هنا. إذا أعجبك المنشور، تأكد من الاشتراك في مدونتي. لا تكون الجشع مع وصلة ل مقالات مشوقةومشاركتها مع أصدقائك. وداعا وداعا!
مع أطيب التحيات، رومان تشيشوف
يقرأ: 194 مرة
في هذه المقالة سنتناول بالتفصيل الأرقام والعوامل الرياضية وطرق تحويل الرقم إلى سلسلة والعكس، بالإضافة إلى العديد من النقاط المهمة الأخرى.
تتيح لك الدالة isFinite التحقق مما إذا كانت الوسيطة عددًا محدودًا.
كإجابة هذه الوظيفةتُرجع false إذا كانت الوسيطة هي Infinity أو -Infinity أو NaN أو سيتم تحويلها إلى إحدى هذه القيم الرقمية الخاصة. وإلا فإن هذه الدالة ستعود صحيحة.
IsFinite(73); // صحيح isFinite(-1/0); // خطأ isFinite(Infinity); // خطأ isFinite(NaN); // خطأ isFinite("نص"); // خطأ شنيع
بالإضافة إلى وظيفة isFinite العامة، تحتوي JavaScript أيضًا على طريقة Number.isFinite. على عكس isFinite، فهو لا يفرض تحويل الوسيطة إلى رقم.
IsFinite("73"); // صحيح Number.isFinite("73"); // خطأ شنيع
تم تصميم الدالة isNaN لتحديد ما إذا كانت الوسيطة عبارة عن رقم أو يمكن تحويلها إلى رقم واحد. إذا كان الأمر كذلك، فإن الدالة isNaN ترجع خطأ. وإلا فإنه يعود صحيحا.
IsNaN(NaN); // صحيح isNaN("25px"); // صحيح، لأن 20 بكسل ليس رقمًا isNaN(25.5); //خطأ isNaN("25.5"); //خطأ isNaN(" "); // خطأ، لأن يتم تحويل مسافة أو عدة مسافات إلى 0 isNaN(null); // خطأ، لأن يتم تحويل القيمة الخالية إلى 0 isNaN(true); // خطأ، لأن يتم تحويل true إلى 1 isNaN(false); // خطأ، لأن يتم تحويل الخطأ إلى 0
إذا كان من الضروري تنفيذ هذا الإجراء بدون تحويل النوع، فاستخدم طريقة Number.isNaN. تم تقديم هذه الطريقة في اللغة بدءًا من ECMAScript 6.
يمكنك تحويل سلسلة بشكل صريح إلى رقم باستخدام الطرق التالية:
1. استخدم المشغل الأحادي +، والتي يجب وضعها قبل القيمة.
+"7.35"; // 7.35 +"نص"; // نان
تتجاهل هذه الطريقة المسافات في بداية السطر ونهايته، بالإضافة إلى \n (تغذية السطر).
+" 7.35 "؛ //7.35 +"7.35 \n "; //7.35
استخدام هذه الطريقةفمن الضروري الانتباه إلى حقيقة ذلك خط فارغأو يتم تحويل سلسلة مكونة من مسافات و\n إلى الرقم 0. بالإضافة إلى ذلك، فإنه يحول أيضًا نوع البيانات الفارغة والقيم المنطقية إلى رقم.
باطل؛ //0 +صحيح; //1 +خطأ؛ //0 +" "؛ //0
2. وظيفة ParseInt. تم تصميم هذه الوظيفة للتحويل حجة لعدد صحيح. على عكس استخدام عامل أحادي + , هذه الطريقةيسمح لك بتحويل سلسلة إلى رقم، حيث ليست كل الأحرف رقمية. ويبدأ في تحويل السلسلة، بدءاً من الحرف الأول. وبمجرد أن تواجه حرفًا غير رقمي، تتوقف هذه الدالة عن عملها وترجع الرقم الناتج.
ParseInt("18px"); //18 parseInt("33.3%"); //33
يمكن أن تعمل هذه الوظيفة مع أنظمة مختلفةالأرقام (ثنائي، ثماني، عشري، سداسي عشري). يتم تحديد قاعدة نظام الأرقام باستخدام وسيطتين.
ParseInt("18px", 10); //18 parseInt("33.3%", 10); //33 parseInt("101",2); //5 parseInt("B5",16); //181
بالإضافة إلى وظيفة parseInt، تحتوي JavaScript على طريقة Number.parseInt. لا تختلف هذه الطريقة عن وظيفة parseInt وقد تم تقديمها في JavaScript بمواصفات ECMASCRIPT 2015 (6).
3. وظيفة parseFloat. الدالة parseFloat تشبه الدالة parseInt، إلا أنها تسمح لك بتحويل الوسيط إلى رقم كسري.
ParseFloat("33.3%"); //33.3
بالإضافة إلى ذلك، فإن الدالة parseFloat، على عكس parseInt، لا تحتوي على وسيطتين، وبالتالي تحاول دائمًا التعامل مع السلسلة كرقم في النظام العشريالحساب.
ParseFloat("3.14"); parseFloat("314e-2"); parseFloat("0.0314E+2");
بالإضافة إلى وظيفة parseFloat، تحتوي JavaScript على طريقة Number.parseFloat. لا تختلف هذه الطريقة عن وظيفة parseFloat وقد تم تقديمها في JavaScript بمواصفات ECMASCRIPT 2015 (6).
يمكنك تحويل رقم إلى سلسلة باستخدام طريقة toString.
(12.8).toString(); //"12.8"
يتيح لك التابع toString أيضًا تحديد أساس نظام الأرقام، مع الأخذ في الاعتبار أنك تحتاج إلى تحويل الرقم بشكل صريح إلى سلسلة:
(255).toString(16); //"وما يليها"
تحديد ما إذا كانت القيمة رقم متغيريمكنك استخدام إحدى الطرق التالية:
1. استخدام الدالتين isNaN وisFinite:
// myVar متغير if (!isNaN(parseFloat(myVar)) && isFinite(parseFloat(myVar))) ( //myVar هو رقم أو يمكن إرساله إليه)؛
كوظيفة:
// الدالة function isNumeric(value) ( return !isNaN(parseFloat(value)) && isFinite(parseFloat(value));) // استخدم var myVar = "12px"; console.log(isNumeric(myVar)); //حقيقي
تتيح لك هذه الطريقة تحديد ما إذا كانت القيمة المحددة رقمًا أم يمكن تحويلها إلى رقم. هذا الخيارلا يحسب السلسلة الفارغة، سلسلة المسافات، فارغة، إنفينيتي، -إنفينيتي، صحيح وخطأ كرقم.
2. باستخدام عامل التشغيل typeof والدوال isFinite، isNaN:
// الدالة التي تتحقق مما إذا كانت القيمة عبارة عن رقم function isNumber(value) ( نوع الإرجاع للقيمة === "number" && isFinite(value) && !isNaN(value); }; // использование функции isNumber isNumber(18); //true // использование функций для проверки текстовых значений isNumber(parseFloat("")); //false isNumber(parseFloat("Infinity")); //false isNumber(parseFloat("12px")); //true !}
تحدد هذه الوظيفة ما إذا كانت القيمة المحددة من النوع رقم، وكذلك ما إذا كانت تنتمي إلى أحد النوعين معاني خاصةإنفينيتي، -إنفينيتي ونان. إذا كان الأمر كذلك، فإن هذه الدالة ترجع صحيحًا.
3. استخدام طريقة ECMAScript 6 Number.isInteger(value). تتيح لك هذه الطريقة تحديد ما إذا كانت القيمة المحددة عددًا صحيحًا.
Number.isInteger("20"); //خطأ، لأن لا تقوم هذه الطريقة بتحويل سلسلة إلى رقم Number.isInteger(20); // صحيح، لأن قيمة معينةهو رقم
يمكنك التحقق مما إذا كان الرقم زوجيًا أم فرديًا باستخدام الوظائف التالية:
// دالة للتحقق من رقم من أجل دالة تكافؤ زوجي isEven(n) ( return n % 2 == 0; ) // دالة للتحقق من رقم من أجل دالة تكافؤ فردي isOdd(n) ( return Math.abs(n % 2) == 1;)
ولكن قبل إجراء مثل هذا الفحص، من المستحسن التأكد من أن القيمة المحددة هي رقم:
القيمة = 20؛ إذا (Number.isInteger(value)) ( if (isEven(value)) ( console.log("Number " + value.toString() + " - Even"); ) )
دعونا نلقي نظرة على مثال نشتق فيه باستخدام جافا سكريبت بسيطةالأعداد من 2 إلى 100.
// الدالة التي تتحقق مما إذا كان الرقم أوليًا الدالة isPrime(value) ( if (isNaN(value) || !isFinite(value) || value%1 || value< 2) return false; var max=Math.floor(Math.sqrt(value)); for (var i = 2; i< = max; i++) { if (value%i==0) { return false; } } return true; } // создать массив, который будет содержать الأعداد الأوليةمن 2 إلى 100 var PrimaryNumber = ; ل(فار ط = 2؛ ط
هناك طرق مختلفة لتقريب الكسر إلى رقم صحيح في JavaScript.
1. استخدام أساليب Math.floor وMath.ceil وMath.round المصممة خصيصًا لهذا الغرض. تقوم طريقة Math.floor بتقريب الكسر إلى أقرب عدد صحيح، أي. ببساطة يتجاهل الجزء الكسري. يقوم Math.ceil بتقريب الكسر إلى أقرب رقم صحيح. يقوم Math.round بتقريب رقم لأعلى أو لأسفل اعتمادًا على قيمة الجزء الكسري. إذا كان الجزء الكسري أكبر من أو يساوي 0.5، فهو لأعلى، وإلا فإن الالتواء لأسفل.
Console.log(Math.floor(7.9)); //7 console.log(Math.ceil(7.2)); //8 console.log(Math.round(7.5)); //8
2. استخدام طريقة toFixed (الدقة). تعمل هذه الطريقة على تقريب الجزء الكسري من الرقم إلى الدقة المحددة. يتم إرجاع نتيجة التقريب كسلسلة.
Console.log(7.987.toFixed(2)); //"7.99"
إذا لم تكن هناك منازل عشرية كافية لتكوين الدقة المحددة للرقم، فسيتم ملؤه بالأصفار.
Console.log(7.987.toFixed(5)); //"7.98700"
3. استخدام طريقة toPrecision (الدقة). تمثل هذه الطريقة رقمًا بدقة محددة. في الوقت نفسه، يمكنه تقريب ليس فقط الكسور، ولكن أيضا الجزء بأكمله من الرقم. اعتمادا على النتيجة، يمكن لهذه الطريقة تقديم الرقم الناتج بنقطة ثابتة أو في شكل أسي.
Console.log((1001).toPrecision(2)); //"1.0e+3" console.log((1001).toPrecision(5)); //"1001.0" console.log((12.4).toPrecision(1)); //"1e+1" console.log((12.4).toPrecision(2)); //"12" console.log((12.4).toPrecision(3)); //"12.4" console.log((12.4).toPrecision(5)); //"12.400"
4. الاستخدام العوامل المنطقيةليس أو أو.
// عبر النفي المنطقي المزدوج console.log(~7.9); //7 // باستخدام OR المنطقي مع الصفر: console.log(7.9^0); //7
يمكنك الحصول على الجزء الصحيح من الرقم باستخدام التابعين Math.floor() وparseInt():
Console.log(Math.floor(7.21)); // 7 console.log(parseInt(7.21)); // 7
يمكنك الحصول على الجزء الكسري من الرقم باستخدام عامل النسبة المئوية (%). هذا المشغلإرجاع الباقي الذي سيتم الحصول عليه من قسمة الرقم الأول على الثاني. في في هذه الحالةيجب عليك استخدام 1 كالرقم الثاني.
Console.log(7.21%1); // 0.20999999999999996 // دقيق حتى رقمين عشريين console.log((7.21%1).toFixed(2)); // "0.21"
بالإضافة إلى ذلك، يمكن أيضًا الحصول على الجزء الكسري باستخدام الحسابات:
رقم المتغير = 7.21؛ var FractionNumber = number - Math.floor(Math.abs(number)); console.log(fractionNumber); // 0.2099999999999996
يمكنك تحديد ما إذا كان الرقم قابلاً للقسمة على عدد صحيح باستخدام عامل النسبة المئوية:
رقم المتغير = 9؛ // إذا كان باقي الرقم مقسومًا على 3 هو 0، فنعم، وإلا لا إذا (number%3==0) ( console.log ("الرقم " + number + " يقبل القسمة على 3"); ) else ( console.log("الرقم " + الرقم + " لا يقبل القسمة على 3"); )
في JavaScript، قم بتنسيق إخراج الرقم وفقًا لـ المعايير الإقليمية (اعدادات اللغة نظام التشغيل) يسمح بطريقة toLocaleString().
على سبيل المثال، لنقم بتنسيق رقم وفقًا للمعايير الإقليمية المثبتة في النظام افتراضيًا:
رقم المتغير = 345.46؛ console.log(number.toLocaleString()); //"345.46"
على سبيل المثال، لنقم بتنسيق الرقم وفقًا للمعايير الإقليمية لروسيا (ru):
Console.log((108.1).toLocaleString("ru-RU")); //"108.1"
يمكن أيضًا استخدام هذه الطريقة لتنسيق رقم كعملة:
Console.log((2540.125).toLocaleString("ru-RU"،(نمط:"currency"، العملة:"RUB"))); //"2,540.13 ₽" console.log((89.3).toLocaleString("ru-RU"،(style:"currency"، العملة:"USD"))); //"89.30 $" console.log((2301.99).toLocaleString("ru-RU"،(style:"currency"، العملة:"EUR"))); //"2,301.99 يورو"
تمثيل الرقم كنسبة مئوية:
Console.log((0.45).toLocaleString("ru-RU",(style:"percent"))); //"45%"
قم بتقسيم الرقم إلى أرقام (خاصية useGrouping):
Console.log((125452.32).toLocaleString("ru-RU",(useGrouping:true))); //"125,452.32"
طباعة رقم س قدر معينالأرقام (2) بعد العلامة العشرية:
Console.log((1240.4564).toLocaleString("ru-RU"،(minimumFractionDigits:2,maximFractionDigits:2))); //"1,240.46"
يتم استخدام عوامل التشغيل التالية لمقارنة الأرقام في JavaScript: == (يساوي)، != (غير متساوي)، > (أكبر من)،< (меньше), >= (أكبر من أو يساوي)،<= (меньше или равно).
على سبيل المثال، دعونا نقارن رقمين:
Console.log(2>3); //خطأ console.log(5>=3); //حقيقي
عند مقارنة الأرقام مع الجزء الكسريومن الضروري أن تأخذ في الاعتبار الأخطاء التي قد تحدث أثناء هذه الحسابات.
على سبيل المثال، في JavaScript مجموع الأرقام (0.2 + 0.4) لا يساوي 0.6:
Console.log((0.2+0.4)==0.6); //خطأ شنيع
تحدث الأخطاء لأن جميع الحسابات تتم عن طريق الكمبيوتر أو غيره جهاز الكترونيينتج في نظام رقمين. أولئك. قبل تنفيذ أي إجراء، يجب على الكمبيوتر أولاً تحويل الأرقام المعروضة في التعبير إلى نظام الأرقام الثاني. ولكن لا يمكن تمثيل كل رقم عشري كسري بدقة في نظام الأرقام الثاني.
على سبيل المثال، الرقم 0.25 10 بوصة النظام الثنائيتحويلها بالضبط.
0.125 × 2 = 0.25 | 0 0.25 × 2 = 0.5 | 0 0.5 × 2 = 1 | 1 0.125 10 = 0.001 2
على سبيل المثال، يمكن تحويل الرقم 0.2 10 إلى النظام 2 فقط بدقة معينة:
0.2 × 2 = 0.4 | 0 0.4 × 2 = 0.8 | 0 0.8 × 2 = 1.6 | 1 0.6 × 2 = 1.2 | 1 0.2 × 2 = 0.4 | 0 0.4 × 2 = 0.8 | 0 0.8 × 2 = 1.6 | 1 0.6 × 2 = 1.2 | 1 0.2 × 2 = 0.4 | 0 0.4 × 2 = 0.8 | 0 0.8 × 2 = 1.6 | 1 0.6 × 2 = 1.2 | 1 ... 0.2 10 = 0.001100110011...2
ونتيجة لذلك، ستؤثر هذه الأخطاء على حساب مجموع رقمين ونتائج المقارنة. أولئك. اتضح أن هذا حقيقي جافا سكريبتسوف نرى هذا الإدخال على النحو التالي:
0.6000000000000001==0.6
عند حساب أو عرض الأرقام ذات الأجزاء الكسرية، يجب عليك دائمًا الإشارة إلى الدقة التي تريد القيام بذلك بها.
على سبيل المثال، قم بمقارنة الأرقام حتى منزلتين عشريتين باستخدام التابعين toFixed() وtoPrecision():
// طريقة toFixed() console.log((0.2+0.4).toFixed(2)==(0.6).toFixed(2)); //صحيح //طريقة toPrecision() console.log((0.2+0.4).toPrecision(2)==(0.6).toPrecision(2)); //حقيقي
توجد العوامل الرياضية التالية في JavaScript: + (إضافة)، - (طرح)، * (ضرب)، / (قسمة)، % (modulo)، ++ (زيادة قيمة بمقدار 1)، - (تقليل قيمة بمقدار 1).
6+3 //9 6-3 //3 6*3 //18 6/3 //2 6%3 //0، أي. 6:3=2 => 6-3*2 => بقية(0) 5%2 //1، أي. 5:2=2(.5) => 5-2*2 => بقية(1) 7.3%2 //1.3، أي 7.3:2=3(.65) => 7.3-2*3 => Rest(1.3) // علامة نتيجة العملية % تساوي إشارة القيمة الأولى -9%2.5 //-1.5 ، أي. 9:2.5=3(.6) => 9-2.5*3 => راحة(1.5) -9%-2.5 //-1.5، أي. 9:2.5=3(.6) => 9-2.5*3 => بقية(1.5) -2%5 //-2، أي. 2:5=0(.4) => 2-5*0 => الراحة(2) x = 3; console.log(x++); // يخرج 3، ثم يضبط 4 console.log(x); //4 × = 3؛ console.log(++x); // مجموعات 4 والمخرجات س = 5؛ console.log(x--); // يخرج 5، ثم يضبط 4 console.log(x); //4 × = 5؛ console.log(--x); // مجموعات 4 والمخرجات بالإضافة إلى ذلك، تحتوي JavaScript على عوامل تشغيل مجمعة: x+=y (x=x+y)، x-=y (x=x-y)، x*=y (x=x*y)، x/= ص (x=x/y)، x%=y (x=x%y). س = 3؛ ص = 6؛ x+=y; console.log(x); //9 س = 3؛ ص = 6؛ x-=y; console.log(x); //-3 س = 3; ص = 6؛ x*=y; console.log(x); //18 س = 3؛ ص = 6؛ س/=ص; console.log(x); //0.5 س = 3; ص = 6؛ x%=y; console.log(x); //3