BigInt (BigInt)
اینجا نوع داده «BigInt» را می شناسی. «نوع داده (Data Type)» یعنی شکل نگهداری مقدار. BigInt مخصوص «اعداد صحیح خیلی بزرگ» است. با آن دقت از بین نمی رود.
چرا BigInt؟ دقت Number محدود است
عدد «Number» تا 15 رقم دقیق است. بعد از آن گرد می شود و خطا می بینی.
// 15 رقم دقیق
let x = 999999999999999;
// 16 رقم نادقیق
let y = 9999999999999999;
حد امن اعداد در جاوااسکریپت
بزرگ ترین و کوچک ترین عدد صحیح «امن» با این ثابت ها مشخص می شوند.
// بیشینه امن
let max = Number.MAX_SAFE_INTEGER;
// کمینه امن
let min = Number.MIN_SAFE_INTEGER;
ساخت BigInt
دو راه داری: پسوند n روی عدد صحیح، یا سازنده BigInt با رشته.
// پسوند n
let a = 999999999999999n;
// سازنده با رشته
let b = BigInt("999999999999999");
let c = 12345678901234567890n;
let d = BigInt("12345678901234567890");
هشدار: ساخت BigInt از Number بزرگ ممکن است نادقیق باشد.
typeof و نوع داده
خروجی typeof برای مقدار BigInt برابر "bigint" است.
let v = BigInt(999999999999999);
let t = typeof v;
عملگرهای حسابی روی BigInt
جمع، تفریق، ضرب، تقسیم صحیح، توان و بقیه پشتیبانی می شوند.
let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;
ترکیب BigInt و Number
آمیختن مستقیمشان خطا می دهد. یکی را صریح تبدیل کن.
let b1 = 10n;
let n1 = 5;
let bad = b1 + n1; // TypeError
let b2 = 10n;
let n2 = 5;
let ok = Number(b2) + n2;
تبدیل های BigInt و Number
از Number() برای تبدیل به Number و از BigInt() برای برعکس استفاده کن.
let large = BigInt("12345678901234567890");
let num = Number(large);
نکته: تبدیل مقادیر خیلی بزرگ ممکن است Infinity یا کاهش دقت بدهد.
اعشار و تقسیم در BigInt
BigInt اعشار ندارد. تقسیم هم خروجی اعشاری نمی دهد.
let badDec = 1.5n; // TypeError
let five = 5n;
let half = Number(five) / 2;
مقایسه ها
مقایسه ها معمولی اند. اما === نوع را هم می سنجد و معمولاً false است.
let c1 = 10n > 5n;
let c2 = 10n === 10;
let c3 = 10n == 10;
عملگرهای بیتی و شیفت با BigInt
بیتی ها فقط بین BigInt ها مجازند. شیفت چپ و راست علامت دار پشتیبانی می شوند.
let a1 = 5n;
let b1b = 3n;
let andv = a1 & b1b;
let orv = a1 | b1b;
let xorv = a1 ^ b1b;
let notv = ~a1;
let big = 10n;
let l = big << 2n;
let r = big >> 1n;
هشدار: شیفت >>> برای BigInt مجاز نیست.
BigInt در مبناهای مختلف
مانند Number، با پیشوندها می توان هگز، اکتال و باینری نوشت.
let normal = 256n;
let oct = 0o400n;
let hex = 0x100n;
let bin = 0b100000000n;
let hex2 = 0x20000000000003n;
let oct2 = 0o400000000000000003n;
let bin2 = 0b100000000000000000000000000000000000000000000000000011n;
کنجکاوی دقت و امنیت
بعد از حد امن، مقایسه ها عجیب می شوند. BigInt این مشکل را ندارد.
9007199254740992 === 9007199254740993; // true
9007199254740992n === 9007199254740993n; // false
گام های تمرین
- یک BigInt با پسوند n بساز.
- با Number() آن را تبدیل کن.
- یک ضرب بزرگ با BigInt انجام بده.
نکته: برای بیتی ها صفحه عملگرهای بیتی و برای ثابت های امن مرجع عدد را ببین.
جمع بندی سریع
- BigInt مخصوص اعداد صحیح خیلی بزرگ است.
- با Number مستقیم ترکیب نکن.
- اعشار در BigInt وجود ندارد.
- بیتی ها فقط بین BigInt ها هستند.
- >>> در BigInt وجود ندارد.