اعداد (Numbers)
در جاوااسکریپت، «عدد (Number)» یک نوع داده ی واحد است. یعنی عدد صحیح و اعشاری جدا نیستند. بنابراین کار با اعداد ساده است، اما دقت اعشاری گاهی tricky می شود. با مثال های کوتاه جلو می رویم.
نوع عدد و نمایش علمی
جاوااسکریپت فقط یک نوع عدد دارد. می توانی اعشار بنویسی یا ننویسی. همچنین، نمایش علمی «e» اعداد خیلی بزرگ یا کوچک را ساده می کند.
let x = 3.14;
let y = 3;
let a = 123e5;
let b = 123e-5;
اعداد 64 بیتی شناور (IEEE 754)
همه اعداد با «شناور 64 بیتی (Double)» ذخیره می شوند. پس انواعی مثل int یا float نداریم. بخش سیگن، توان و مانتیسا در 64 بیت نگه داری می شوند.
دقت اعداد صحیح و اعشاری
اعداد صحیح تا 15 رقم دقیق اند. اما محاسبات اعشاری همیشه دقیق نیست. برای بهبود، ضرب و تقسیم کمکی است.
let i1 = 999999999999999;
let i2 = 9999999999999999;
let p1 = 0.2 + 0.1;
let p2 = (0.2 * 10 + 0.1 * 10) / 10;
جمع عدد و رشته
عملگر + هم «جمع» است و هم «چسباندن (Concatenate)». اگر یکی رشته باشد، خروجی معمولاً رشته می شود.
let a1 = 10;
let a2 = 20;
let z1 = a1 + a2;
let b1 = "10";
let b2 = "20";
let z2 = b1 + b2;
let z3 = a1 + b2;
let z4 = b1 + a2;
let msg = "The result is: " + a1 + a2;
let mix = a1 + a2 + "30";
رشته های عددی و تبدیل خودکار
در عملگرهای عددی، جاوااسکریپت تلاش می کند رشته عددی را به عدد تبدیل کند. اما با + معمولاً چسباندن انجام می شود.
let sx = "100";
let sy = "10";
let d1 = sx / sy;
let m1 = sx * sy;
let s1 = sx - sy;
let c1 = sx + sy;
NaN (عدد نامعتبر)
NaN یعنی «نتیجه عددی نیست». تقسیم بر متن غیرعددی، NaN می دهد. نوع NaN هم «number» است.
let n1 = 100 / "Apple";
let n2 = 100 / "10";
let bad = isNaN(n1);
let k = NaN + 5;
let s = NaN + "5";
let t = typeof NaN;
Infinity و تقسیم بر صفر
وقتی عدد از بزرگ ترین مقدار بالاتر رود، Infinity می گیری. همچنین تقسیم بر صفر، Infinity می دهد.
let myNumber = 2;
while (myNumber != Infinity) {
myNumber = myNumber * myNumber;
}
let dpos = 2 / 0;
let dneg = -2 / 0;
let tt = typeof Infinity;
هگزادسیمال و مبناها
ثابت های پیشوند 0x هگزادسیمال اند. با toString(radix) می توانی عدد را در مبناهای 2 تا 36 نمایش دهی.
let hx = 0xFF;
let num = 32;
let r32 = num.toString(32);
let r16 = num.toString(16);
let r8 = num.toString(8);
let r2 = num.toString(2);
Number شیء یا مقدار اولیه؟
اعداد معمولاً «مقدار اولیه (Primitive)» هستند. ساخت شیء با new Number() پیشنهاد نمی شود و مقایسه ها را گیج کننده می کند.
let px = 123;
let po = new Number(123);
let eq1 = (500 == new Number(500));
let eq2 = (500 === new Number(500));
let o1 = new Number(500);
let o2 = new Number(500);
let res1 = (o1 == o2);
let res2 = (o1 === o2);
گام های تمرین
- با
toString(2)عدد را دودویی نمایش بده. - اشتباه
0.2 + 0.1را با ضرب/تقسیم اصلاح کن. - با
isNaN()ورودی کاربر را چک کن.
نکته: ادامه جزئیات در متدهای اعداد و مرجع اعداد موجود است.
جمع بندی سریع
- فقط یک نوع Number داریم.
- دقت اعشاری کامل نیست.
+ممکن است رشته ها را بچسباند.- NaN نوعش number است.
new Number()دردسرساز است.