تقدم لك هذه المقالة المعرفة ذات الصلة بـ JavaScript، والتي تقدم بشكل أساسي المحتوى ذي الصلة بأنواع الأرقام. هناك نوعان من الأرقام في JavaScript: النوع Number وBigInt، فلنلقي نظرة عليهما معًا. يساعد.
[توصيات ذات صلة: فيديو تعليمي لجافا سكريبت، واجهة الويب الأمامية]
هناك نوعان من الأرقام في JavaScript
:
يتم تخزين نوع Number
، وهو نوع رقم بالمعنى التقليدي، بتنسيق IEEE-754
64
بت وهو "رقم فاصلة عائمة مزدوج الدقة". من نوع Number
؛
يمثل نوع BigInt
أعدادًا صحيحة بأي طول. عادةً لا نستخدمها إلا إذا كانت تمثل أرقامًا غير 2 53 إلى -2 53. وسنقدم أنواع البيانات الاحترافية هذه بالتفصيل في الفصول اللاحقة؛
طريقة كتابة الأرقام بسيطة للغاية، لكن JavaScrpt
تحتوي على الكثير من السكر النحوي المريح والسريع الذي يمكننا استخدامه، ولن يؤدي تعلم هذه السكريات النحوية إلى تحسين قدرتنا على قراءة التعليمات البرمجية فحسب، بل سيحسن أيضًا الإحساس عالي المستوى بالكود الخاص بنا.
الأعداد العشرية هي أبسطها، وسوف نستخدمها بشكل أو بآخر في كل مقال تقريبًا، على سبيل المثال، نقوم بإنشاء متغير وتخزين 100
مليار:
دع عشرة مليارات = 10000000000؛
على الرغم من أن العملية بسيطة للغاية، إلا أن هناك مشكلة: من الصعب حساب عدد 0
التي تتبع 1
إذا كنا نكتب رمز تحويل، فقد يؤدي الرقم 0
الخاطئ إلى الإفلاس.
في هذا الوقت، يمكننا استخدام _
كمحدد، على النحو التالي:
دع عشرة مليارات = 10_000_000_000؛
يمكن للكود أعلاه حساب عدد 0
بوضوح، ومن الواضح أن هذا هو الحل الأمثل!
_
السفلية هنا عبارة عن سكر نحوي JavaScript
، والذي سيتم تجاهله بواسطة المحرك أثناء التنفيذ. طريقتا الكتابة المذكورتان أعلاه لهما نفس التأثير، لكن تجربة القراءة مختلفة تمامًا.
دائرة الدماغ تشينغكي
يجب أن تتساءل بعض أحذية الأطفال، لقد كنت دائمًا في مجموعات 0
4
أن كنت طفلاً، لماذا يجب 0
أضم إلى المجموعة 3
؟ لذلك يمكننا كتابتها بالطريقة التالية دون أي مشكلة:
دع عشرة مليارات = 100_0000_0000؛
أو يمكن كتابتها هكذا:
دع عشرة مليارات = 1_0000_0000_00؛
ما أريد التعبير عنه هنا هو أنه بغض النظر عن طريقة القسمة التي تستخدمها، فإنها لن تؤثر على حجم الرقم نفسه. توصل إلى أقوى طريقة!
على الرغم من أن استخدام _
يمكن أن يقسم العديد 0
بشكل أنيق، إلا أننا في الحياة الواقعية لا نكتبها بهذه الطريقة بشكل عام، على سبيل المثال، غالبًا ما نكتب 10000000000
كـ "10 مليارات"، بحيث يمكن حذف العديد 0
، مما يقلل من إمكانية تكوينها. أخطاء.
توفر JavaScript
أيضًا طريقة لحذف 0
يمكننا استخدام الحرف e
متبوعًا برقم لتمثيل الرقم 0
على سبيل المثال:
دع عشرة مليارات = 1e10;//10 مليار، 1 متبوعًا بـ 10 0sconsole.log(3.14e9);//3140000000، متبوعًا بـ 7 أصفار، يرجى النظر إلى الأسفل إذا كان لديك أي أسئلة.
إن فهم الكود أعلاه بسيط للغاية، ويمكن فهم e10
على أنه 1_0000_0000_00
0
وهو 1
متبوعًا بـ 10
، لذلك يمكننا التفكير:
1e10 === 1 * 1_0000_0000_00;//e10 يعني 1 متبوعًا بـ 10 03.14e9 === 3.14 * 1_000_000_000;//e9 يعني 1 متبوعًا بـ 9 0s
يمكننا أيضًا استخدام هذه الطريقة لتمثيل أعداد صغيرة جدًا، مثل 1
نانومتر:
دع نانومتر = 0.000000001؛ // الوحدة (متر)
نظرًا لوجود عدد كبير جدًا 0
، يمكننا أيضًا استخدام _
:
دع نانومتر = 0.000_000_001؛
بالطبع، يمكنك أيضًا استخدام e
لحذف جميع 0
، كما يلي:
دع nm = 1e-9;//9 0s على يسار 1، بما في ذلك ما قبل العلامة العشرية
بمعنى آخر، e-9
تعني 1 -9 وهو 1/1000_000_000
، وبالتالي فإن المعادلة التالية صحيحة:
1e-9 === 1 / 1_000_000_000;3.14e-8 === 3.14 / 1_000_000_00;
النظام الست عشري هو تنسيق شائع الاستخدام في البرمجة، مثل اللون والتشفير وما إلى ذلك. يمكننا إضافة 0x
قبل الأرقام العادية لتمثيل الأرقام الست عشرية:
Let hex = 0xff;//255، غير حساس لحالة الأحرف، 0xFF هو نفسه
الأرقام الثنائية تبدأ بـ 0b
:
دع بن = 0b1011;//11
الأعداد الثمانية تبدأ بـ 0o
:
دع oct = 0o777;//511
تدعم طريقة الكتابة البسيطة هذه الأنواع الثلاثة الخاصة فقط، أما بالنسبة للأرقام الأساسية الأخرى، فيمكنك استخدام وظائف خاصة لإنشاءها ( parseInt
).
يمكن لطريقة toString
تحويل الرقم إلى نموذج سلسلة يتوافق مع base
.
إعطاء الكستناء:
دع الأعداد = 996؛ console.log(num.toString(8));// تحويل إلى سلسلة ثماني console.log(num.toString(16));// تحويل إلى سلسلة سداسية عشرية console.log(num.toString( 32));// تحويل إلى 32 سلسلة ست عشرية
نتائج تنفيذ التعليمات البرمجية هي كما يلي:
يمكن أن يتراوح نطاق base
من 2
إلى 36
إذا لم يتم ملؤه، فإن القيمة الافتراضية هي 10
.
لاحظ أنه إذا كنت تستخدم أرقامًا لاستدعاء التابع toString
مباشرةً، ففي بعض الحالات تحتاج إلى تطبيق two .
console.log(123.toString(8));// خطأ، خطأ في بناء الجملة console.log(123..toString(8));// صحيح، 173
هناك .
بعد الرقم، وذلك لأنه في JavaScript
.
النقطة الأولى بعد الرقم هي النقطة العشرية .
إذا كان رقمًا عشريًا، فهذه المشكلة غير موجودة على سبيل المثال:
console.log(3.14.toString(8));
أو يمكننا استخدام الأقواس لتجنب استخدام النقطتين، على سبيل المثال:
console.log((123).toString(8));//'173
يعد التقريب إحدى العمليات الأكثر شيوعًا على الأرقام وعادةً ما يتضمن ما يلي:
تقريب للأسفل، Math.floor(num)
console.log(Math.floor(3.14));//3 console.log(Math.floor(9.99));//9 console.log(Math.floor(-3.14));//-4 console.log(Math.floor(-9.99));//-10
لا تتبع مبدأ التقريب وخذ مباشرة أقرب عدد صحيح أقل من أو يساوي القيمة الحالية.
تقريب، Math.ceil(num)
console.log(Math.ceil(3.14));//4 console.log(Math.ceil(9.99));//10 console.log(Math.ceil(-3.14));//-3 console.log(Math.ceil(-9.99));//-9
لا تتبع مبدأ التقريب وخذ مباشرة أقرب عدد صحيح أكبر من أو يساوي الرقم الحالي.
التقريب إلى أقرب عدد صحيح، Math.round(num)
console.log(Math.round(3.14));//3 console.log(Math.round(9.99));//10 console.log(Math.round(-3.14));//-3 console.log(Math.round(-9.99));//-10
باتباع مبدأ التقريب، يتم أخذ أقرب عدد صحيح للرقم الحالي.
إزالة الكسور العشرية، Math.trunc(num)
console.log(Math.trunc(3.14));//3 console.log(Math.trunc(9.99));//9 console.log(Math.trunc(-3.14));//-3 console.log(Math.trunc(-9.99));//-9
قم بإزالة الأرقام مباشرة بعد العلامة العشرية وقم بتقريبها إلى أرقام صحيحة. متصفح IE لا يدعم هذه الطريقة
قارن بين الطرق الأربع المذكورة أعلاه:
Math.floor | Math.ceil | الرياضيات | Math.trunc | |
---|---|---|---|---|
3.14 | 3 | 4 | 3 | 3 |
9.99 | 9 | 10 | 10 | 9 |
-3.14 | -4 | -3 | -3 | -3 |
-9.99 | -10 | -9 | -10 | -9 |
الطريقة المذكورة أعلاه تقوم ببساطة بتقريب العلامة العشرية إلى عدد صحيح. في بعض الحالات، نحتاج إلى أعداد عشرية بدقة معينة، على سبيل المثال، ماذا يجب أن نفعل إذا أخذنا آخر 4
أرقام من pi؟
هناك طريقتان:
الرياضيات الضرب والقسمة العد
دع pi = 3.1415926;console.log(Math.round(pi * 10000) / 10000);//3.1416
يقوم الكود أعلاه أولاً بضرب pi
في 10000
، ثم تقريبه، ثم تقسيمه على 10000
، وبالتالي الحصول على نتيجة تلبي متطلبات الدقة. ومع ذلك، يبدو هذا سخيفًا، وتوفر لنا JavaScript
طريقة أسهل.
إلىثابت (ن)
دع pi = 3.1415926;console.log(pi.toFixed(4));//3.1416
يبدو أن الكود أعلاه ليس لديه مشكلة في الإخراج. في الواقع، يُرجع toFixed
سلسلة نصية. إذا كنا بحاجة إلى نوع رقمي، فيمكننا استخدام العامل الأحادي + pi.toFixed(4)
.
بالإضافة إلى ذلك، إذا لم يكن الجزء العشري طويلًا بما يكفي، فسيضيف toFixed
'0'
في النهاية:
Let num = 3.1;console.log(num.toFixed(9));
نتائج تنفيذ التعليمات البرمجية هي كما يلي:
وهذا يثبت أيضًا أن القيمة المرجعة لـ toFixed
عبارة عن سلسلة، وإلا فسيتم حذف 0
.
دائمًا ما تكون تمثيلات النقطة العائمة متحيزة في كثير من الحالات
داخل الكمبيوتر، يتم تمثيل أرقام الفاصلة العائمة وفقًا لمعيار IEEE-754
، حيث تكون أرقام الفاصلة العائمة ذات الدقة الواحدة 32
بت وأرقام الفاصلة العائمة مزدوجة الدقة هي 64
بت. في رقم الفاصلة العائمة مزدوج الدقة، يتم استخدام 1
بت لتمثيل الإشارة، ويتم استخدام 52
بت لتخزين الأرقام المهمة، ويتم استخدام 11
بت لتخزين موضع العلامة العشرية.
على الرغم من أن 64
بت يمكن أن تمثل بالفعل أرقامًا كبيرة جدًا، إلا أنه لا تزال هناك إمكانية لعبور الحدود، على سبيل المثال:
Let bigNum = 1e999;console.log(bigNum);//Infinity
الرقم الذي يتجاوز الحد الأقصى للقيمة سيصبح Infinity
(infinity)، وبالتالي فقدان حجم الرقم الأصلي، وهو نوع من الانحراف.
وهناك نوع آخر من الانحراف علينا أن نتعلمه:
console.log(0.1+0.2 === 0.3);//falseconsole.log(0.1 + 0.2);
نتائج تنفيذ التعليمات البرمجية هي كما يلي:
هذا صحيح، نتيجة 0.1 + 0.2
ليست 0.3
، ولكن مجموعة من 0
تليها 4
.
هذا النوع من الانحراف قاتل للغاية، خاصة في مراكز التسوق وسيناريوهات عمل البنوك، فحتى الانحراف البسيط جدًا سيؤدي إلى خسارة ثروة لا نهاية لها في سيناريوهات معدل الدوران المرتفع.
سمعت ذات مرة قصة موظف بنك سرق ملايين الدولارات عن طريق خصم أجور العمال وكان راتب كل موظف 20 سنتا فقط!
أعتقد أنه إذا حدث لي هذا، فلن أتمكن بالتأكيد من العثور عليه، لذلك من المهم جدًا أن تكون دقيقًا في جميع الأوقات.
لا أعرف إذا كانت هذه القصة صحيحة أم لا ~~
لنأخذ نظامنا العشري المشترك كمثال، نعلم جميعًا أن هناك شيئين غريبين في الكسور العشرية، أحدهما يسمى الأعداد العشرية المتكررة اللانهائية، والآخر يسمى 1/3
العشرية اللانهائية غير المتكررة العشري 0.3333333(3)
و pi وهو عدد عشري لا نهائي وغير متكرر. اللانهائي يعني أن حجم الرقم لا يمكن وصفه بشكل واضح عدديا، وما يمكننا كتابته غير دقيق.
هناك أيضًا بعض الأرقام التي تتكرر بشكل لا نهائي في النظام الثنائي. والفرق هو أنه في النظام العشري، رقم مثل 0.1
والذي يبدو بسيطًا جدًا، هو عدد عشري لا نهائي في النظام الثنائي.
على سبيل المثال:
Let x = 0.1;console.log(x.toFixed(20));
نتائج تنفيذ التعليمات البرمجية هي كما يلي:
ألا تعتقد أنه أمر لا يصدق؟ لقد أنشأنا متغيرًا وخصصنا له القيمة 0.1
، ثم أخذنا 20
منزلة عشرية، لكننا حصلنا على نتيجة مذهلة.
إذا قمنا بتغيير الزاوية، فقد يكون من الأسهل فهم هذه الظاهرة في النظام العشري، أي عدد صحيح مقسوم على 10
أو 10
قوى صحيحة هو رقم طبيعي ودقيق، مثل 1/10
أو 996/1000
. ومع ذلك، إذا قسمت على 3
، فستحصل على نتيجة متكررة، مثل 1/3
.
هذا الوصف صالح أيضًا إذا تم تحويله إلى ثنائي.
في النظام الثنائي، أي عدد صحيح مقسوم على 2
أو قوة عددية 2
هو عدد صحيح عادي، ومع ذلك، إذا قسمته على 10
، فستحصل على حلقة لا نهائية من الأرقام الثنائية.
لذلك، يمكننا أن نستنتج أن الأرقام الثنائية لا يمكن أن تمثل بدقة 0.1
و 0.2
مثلما لا يمكن للرقم العشري أن يصف 1/3
.
يلاحظ:
هذا النوع من انحراف البيانات ليس عيبًا في JavaScript، بل هو نفس النتيجة في PHP وJava وC وPerl وRuby.
التقريب
عند عرض رقم عشري متكرر بشكل لا نهائي، يمكننا استخدام طريقة toFixed
مباشرة لتقريب العلامة العشرية، مما يجعلها مناسبة جدًا لعرض الأسعار.
0.3.toFixed(2);//0.30
استخدم وحدات صغيرة
هناك طريقة أخرى وهي أنه يمكننا استخدام وحدات أصغر لحساب الأسعار والمسافات، مثل استخدام السنت بدلاً من اليوان لحساب السعر الإجمالي. في الواقع، العديد من مواقع التداول تفعل ذلك. ومع ذلك، فإن هذه الطريقة تقلل فقط عدد مرات ظهور الكسور العشرية، ولا توجد طريقة لتجنب حدوث الكسور العشرية تمامًا.
هناك قيمتان خاصتان في أرقام JavaScript
: Infinity
و NaN
.
كيف نحكم على ما إذا كان الرقم رقمًا عاديًا؟
يمكننا استخدام طريقتين:
غير محدود (فال)
ستقوم هذه الدالة بتحويل val
المعلمة إلى نوع رقمي، ثم تحديد ما إذا كان الرقم محدودًا، وإرجاع true
عندما لا يكون الرقم NaN
أو Infinity
أو -Infinity
.
console.log(isFinite(NaN));//falseconsole.log(isFinite(Infinity));//falseconsole.log(isFinite(3));//trueconsole.log(isFinite('12'));// حقيقي
نتائج تنفيذ التعليمات البرمجية هي كما يلي:
نظرًا لأن السلسلة التي لا يمكن تحويلها إلى رقم سيتم تحويلها إلى NaN
، فيمكننا استخدام التابع isFinite
لتحديد ما إذا كانت السلسلة عبارة عن سلسلة رقمية:
console.log(isFinite('xxxx'));//falseconsole.log(isFinite('Infinite'));//falseconsole.log(isFinite(' '));// صحيح، يتم تحويل السلسلة الفارغة إلى 0
نتائج تنفيذ التعليمات البرمجية هي كما يلي:
إيسنان (فال)
يُرجع true
عندما تكون val
هي NaN
أو قيمة أخرى لا يمكن تحويلها إلى رقم.
console.log(isNaN(NaN));//trueconsole.log(isNaN('Infinite'));//true
نتائج تنفيذ التعليمات البرمجية:
لماذا تستخدم الدالة isNaN
بدلاً من قراءتها مباشرة؟
على سبيل المثال:
console.log(NaN === NaN);//false
نتائج تنفيذ التعليمات البرمجية هي كما يلي:
وذلك لأن NaN
لا يساوي أي رقم، بما في ذلك نفسه.
يمكن لـ Object.is(a,b)
تحديد ما إذا كانت المعلمات a
و b
متساوية، إذا كانت متساوية، فإنها تُرجع true
، وإلا فإنها تُرجع false
في ثلاث حالات فقط:
يمكن مقارنتها بـ NaN
console.log(Object.is(NaN,NaN));//true
نتائج تنفيذ التعليمات البرمجية:
0 و -0
console.log(Object.is(0,-0));//false
نتائج تنفيذ التعليمات البرمجية:
داخل الكمبيوتر، يتم تمثيل الموجب والسالب بواسطة 0
و 1
ونظرًا لاختلاف العلامات، فإن 0
و -0
مختلفان بالفعل، ويتم التعبير عنهما بطرق مختلفة.
آخر
حالات المقارنة الأخرى هي نفسها تمامًا مثل a === b
.
يمكن parseInt
و parseFloat
تحويل السلاسل إلى أرقام، على عكس +
و Number
، فإن قيودهما أكثر مرونة. على سبيل المثال، سيؤدي استخدام +
و Number
لسلسلة مثل "100¥"
إلى إرجاع NaN
حتمًا، لكن يمكن parseInt
و parseFloat
التعامل معها بسهولة.
على سبيل المثال:
console.log(+"100¥");console.log(parseInt("100¥"));console.log(parseFloat("12.5¥"));
نتائج تنفيذ التعليمات البرمجية:
يقرأ parseInt
و parseFloat
الأرقام من سلسلة حتى لا يمكن قراءتها بعد الآن. كلاهما مناسب بشكل خاص لمعالجة السلاسل التي تبدأ بأرقام مثل "99px"
و "11.4em"
، ولكن يتم إرجاع NaN
للسلاسل التي تبدأ بأحرف أخرى.
console.log(parseInt('ff2000'));//NaN
ومع ذلك، وجدنا ff2000
parseInt
في الواقع سلسلة رقمية سداسية عشرية يمكنها أيضًا التعامل مع هذا الموقف، ولكنها تحتاج إلى إضافة معلمة سداسية عشرية.
على سبيل المثال:
console.log(parseInt('FF2000',16)); //16719872 console.log(parseInt('0xFF2000',16)); //16719872 console.log(parseInt('nnnnnn',36)); //1430456963
نتائج تنفيذ التعليمات البرمجية:
يحتوي كائن Math
المدمج على العديد من الثوابت والأساليب التي نستخدمها غالبًا، وفيما يلي بعض الأمثلة على تلك الشائعة الاستخدام:
الرياضيات.PI
Pi Π
هو ثابت غير دوري لا نهائي، يمكننا استخدام Math.PI
بدلاً من ذلك:
console.log(Math.PI);
الرياضيات.عشوائي()
توليد رقم عشوائي في الفاصل الزمني [0,1)
:
console.log(Math.random());console.log(Math.random());
إذا أردنا رقمًا عشوائيًا ضمن نطاق معين، فيمكننا ضربه في قيمة محددة ثم تقريبه.
Math.pow(أ،ب)
احسب أ ب ، على سبيل المثال:
console.log(Math.pow(2,3));//8
Math.max()/Math.min()
اختر الحد الأقصى/الحد الأدنى للقيمة من أي عدد من الوسائط:
console.log(Math.max(1,2,3,4,5));//5console.log(Math.min(1,2,3,4,5));//1