التعامل مع الأعداد في لغة JavaScript


يا هلا بالجميع! اليوم راح نتكلم عن شيء أساسي ومهم جداً في أي لغة برمجة: الأرقام وكيف نتعامل معاها في JavaScript. الموضوع بسيط ومباشر، ويلا نبدأ.

1. الأرقام في JavaScript: كلها Float!

في JavaScript، ما عندنا فرق بين أرقام صحيحة (Integers) وأرقام عشرية (Floats) زي لغات ثانية. كل الأرقام تعتبر من نوع واحد وهو number، وهذا النوع يتعامل داخلياً كأرقام عشرية (floating-point numbers) بمعيار IEEE 754.

ملاحظة سريعة: حتى لو كتبت 5، جافاسكريبت بتشوفها 5.0 داخلياً. لا تشغل بالك كثير بالتفاصيل هذي إلا لو كنت تسوي عمليات حسابية دقيقة جداً تحتاج تعرف المشاكل المحتملة في دقة الـ floating-point.

2. العمليات الحسابية الأساسية

الجمع، الطرح، الضرب، القسمة، وباقي القسمة (Modulus) كلها موجودة وسهلة الاستخدام.

let a = 10;
let b = 3;

console.log(a + b); // 13 (جمع)
console.log(a - b); // 7 (طرح)
console.log(a * b); // 30 (ضرب)
console.log(a / b); // 3.3333333333333335 (قسمة)
console.log(a % b); // 1 (باقي القسمة)

3. قيم الأرقام الخاصة (Special Number Values)

فيه قيمتين لازم تكون عارفها:

  • NaN (Not-a-Number): تطلع لك لما تحاول تسوي عملية حسابية غير صالحة. مثلاً، تقسم نص على رقم.
  • Infinity و -Infinity: تطلع لما توصل لرقم كبير جداً أو صغير جداً يتجاوز قدرة JavaScript على تمثيله، أو لما تقسم على صفر.
console.log(0 / 0);      // NaN
console.log("hello" / 2); // NaN
console.log(1 / 0);      // Infinity
console.log(-1 / 0);     // -Infinity

تذكر: NaN غريبة شوي، NaN === NaN دايماً بيعطيك false. عشان تتحقق إذا القيمة NaN، استخدم Number.isNaN() أو isNaN().

4. تحويل النصوص إلى أرقام

هذي من أكثر الأشياء اللي راح تحتاجها. عندنا دوال عالمية (Global Functions) لهذا الغرض:

  • parseInt(string, radix): تحول النص إلى رقم صحيح. الـ radix (الأساس) مهم جداً، خليه 10 دايماً عشان تتجنب مشاكل التحويل من أنظمة أرقام ثانية (زي الثنائي أو السداسي عشر).
  • parseFloat(string): تحول النص إلى رقم عشري.
let strInt = "123";
let strFloat = "123.45";
let strMixed = "42px";
let strInvalid = "hello";

console.log(parseInt(strInt, 10));    // 123
console.log(parseFloat(strFloat));   // 123.45
console.log(parseInt(strMixed, 10));   // 42 (يتوقف عند أول حرف غير رقمي)
console.log(parseFloat(strMixed));  // 42 (يتوقف عند أول حرف غير رقمي)
console.log(parseInt(strInvalid, 10)); // NaN

ممكن تستخدم Number() كدالة تحويل أيضاً:

console.log(Number("123"));    // 123
console.log(Number("123.45")); // 123.45
console.log(Number("42px"));   // NaN (أكثر صرامة من parseInt/parseFloat)

5. دوال وأساليب الأرقام (Number Methods)

الأرقام لها أساليب مفيدة جداً:

  • toFixed(digits): ترجع لك الرقم كنص مع عدد محدد من الأرقام بعد الفاصلة. تقرّب الرقم إذا لزم الأمر.
  • toPrecision(precision): ترجع لك الرقم كنص مع عدد محدد من الأرقام الإجمالية (قبل وبعد الفاصلة).
  • toString(radix): تحول الرقم إلى نص. ممكن تحدد الأساس (زي 2 للثنائي، 16 للسداسي عشر).
let num = 123.45678;

console.log(num.toFixed(2));    // "123.46" (تقريب)
console.log(num.toPrecision(5)); // "123.46" (5 أرقام إجمالية)
console.log(num.toString());    // "123.45678"
console.log((255).toString(16)); // "ff" (تحويل لـ Hex)

6. كائن Math: العمليات الرياضية المتقدمة

كائن Math فيه دوال ثابتة (Static Methods) وثوابت رياضية عشان تسوي عمليات أكثر تعقيداً:

  • Math.round(x): تقريب لأقرب عدد صحيح.
  • Math.floor(x): تقريب للأصغر (لأسفل).
  • Math.ceil(x): تقريب للأكبر (لأعلى).
  • Math.random(): توليد رقم عشوائي بين 0 (شامل) و 1 (غير شامل).
  • Math.max(x1, x2, ...): إيجاد أكبر قيمة.
  • Math.min(x1, x2, ...): إيجاد أصغر قيمة.
  • Math.PI: قيمة باي (3.14159...).
console.log(Math.round(4.7));  // 5
console.log(Math.floor(4.7));  // 4
console.log(Math.ceil(4.2));   // 5
console.log(Math.random());    // رقم عشوائي (مثال: 0.87654...)
console.log(Math.max(10, 5, 20)); // 20
console.log(Math.min(10, 5, 20)); // 5
console.log(Math.PI);          // 3.141592653589793

7. مشكلة دقة الأرقام العشرية (Floating Point Precision)

هذي نقطة مهمة جداً ومصدر لكثير من الأخطاء لو ما انتبهت لها. بسبب طريقة تمثيل الأرقام العشرية داخلياً، أحياناً ممكن تحصل على نتائج غير متوقعة في العمليات الحسابية البسيطة. هذي المشكلة مو بس في JavaScript، بل في أغلب لغات البرمجة.

console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false (هنا المشكلة!)

الحل: لو تحتاج دقة عالية في العمليات المالية مثلاً، الأفضل تستخدم مكتبات متخصصة زي decimal.js أو تتعامل مع الأرقام كـ Integers (مثلاً، تحول الدولارات إلى سنتات قبل العمليات).

وبكذا نكون غطينا أهم الجوانب في التعامل مع الأرقام في JavaScript. الموضوع بسيط لكن معرفة هذي التفاصيل بتخلي كودك أقوى وأقل عرضة للأخطاء. بالتوفيق!