JavaScript BigInt yordamida katta sonlar bilan aniq ishlashni o'rganing. Arifmetik amallar, cheklovlar va amaliy qo'llanilish holatlarini o'rganing.
JavaScript BigInt Arifmetikasi: Katta Sonlar Bilan Hisoblashlar va Aniqlikni Boshqarish
Standart holatda, JavaScript sonli qiymatlarni ifodalash uchun Number ma'lumot turidan foydalanadi. Ko'pgina holatlar uchun yetarli bo'lsa-da, Number turi o'zining asosidagi ikki tomonlama aniqlikdagi suzuvchi nuqtali format (IEEE 754) tufayli juda katta butun sonlarni to'g'ri ifodalashda cheklovlarga ega. Bu uning maksimal xavfsiz butun sonidan (Number.MAX_SAFE_INTEGER), ya'ni 253 - 1 dan oshadigan sonlar bilan ishlaganda aniqlikni yo'qotishga va kutilmagan natijalarga olib kelishi mumkin.
Bu yerda ES2020 da taqdim etilgan, ixtiyoriy uzunlikdagi butun sonlarni ifodalash uchun maxsus ishlab chiqilgan JavaScript'ning o'rnatilgan BigInt ma'lumot turi yordamga keladi. BigInt sizga juda katta sonlar ustida aniqlikni yo'qotmasdan arifmetik amallarni bajarish imkonini beradi. Bu kriptografiya, ilmiy hisoblashlar va moliyaviy dasturlar kabi aniqlik birinchi darajada muhim bo'lgan sohalarda hisob-kitoblar uchun yangi imkoniyatlar ochadi.
BigInt nima?
BigInt - bu Number turining aniq ifodalay oladiganidan kattaroq butun sonlarni ifodalovchi primitiv ma'lumot turidir. Number'dan farqli o'laroq, BigInt'lar belgilangan o'lchamga ega emas, ya'ni ular faqat mavjud xotira bilan cheklangan holda har qanday butun sonni sig'dirish uchun o'sishi mumkin.
BigInt'larni yaratish
JavaScript'da BigInt'larni yaratishning ikkita asosiy usuli mavjud:
- Butun son literali oxiriga
n
qo'shish: Bu eng oddiy usul. Shunchaki son oxiriga 'n' qo'shimchasini qo'shing. Masalan:12345678901234567890n
. BigInt()
konstruktoridan foydalanish: SizBigInt()
konstruktoridan Number, satr yoki boshqa BigInt'ni BigInt qiymatiga o'zgartirish uchun foydalanishingiz mumkin. Masalan:BigInt(12345)
yokiBigInt("12345678901234567890")
. E'tibor bering, suzuvchi nuqtali sonni BigInt'ga o'zgartirish o'nli qismini kesib tashlaydi; u yaxlitlamaydi.
Misol:
const largeNumberLiteral = 9007199254740991n; // 'n' qo'shimchasidan foydalanish
const largeNumberConstructor = BigInt(9007199254740991); // BigInt() konstruktoridan foydalanish
const stringBasedBigInt = BigInt("1234567890123456789012345"); // Satrdan yaratish
console.log(largeNumberLiteral); // Output: 9007199254740991n
console.log(largeNumberConstructor); // Output: 9007199254740991n
console.log(stringBasedBigInt); // Output: 1234567890123456789012345n
BigInt Arifmetik Amallari
BigInt'lar qo'shish, ayirish, ko'paytirish, bo'lish va darajaga oshirish kabi standart arifmetik amallarni qo'llab-quvvatlaydi. Biroq, yodda tutish kerak bo'lgan muhim jihatlar mavjud:
- Aralash Turlar Bilan Arifmetikaga Ruxsat Berilmaydi: Siz BigInt'lar va Number'lar o'rtasida to'g'ridan-to'g'ri arifmetik amallarni bajara olmaysiz. Hisoblashlarni bajarishdan oldin Number'larni
BigInt()
konstruktori yordamida BigInt'larga aniq o'zgartirishingiz kerak. Bu beixtiyor aniqlikni yo'qotishning oldini olish uchun qilingan dizayn qarori. - Bo'lish Xususiyati: BigInt'lar orasidagi bo'lish amali nolga qarab yaxlitlaydi va har qanday kasr qismini tashlab yuboradi. Qoldiqning kasr qismini qaytaradigan modulo operatori (%) ekvivalenti mavjud emas.
- Taqqoslash Operatorlari: Standart taqqoslash operatorlari (
==
,===
,<
,>
,<=
,>=
) BigInt'lar va Number'lar o'rtasida ishlaydi. E'tibor bering,==
turni majburiy o'zgartiradi,===
esa BigInt'ni Number bilan taqqoslasangiz 'false' qaytaradi.
Arifmetik Amallar Misollari
const a = 10n;
const b = 5n;
const c = 2;
console.log(a + b); // Output: 15n (BigInt + BigInt)
console.log(a - b); // Output: 5n (BigInt - BigInt)
console.log(a * b); // Output: 50n (BigInt * BigInt)
console.log(a / b); // Output: 2n (BigInt / BigInt, nolga qarab yaxlitlash)
console.log(a ** b); // Output: 100000n (BigInt darajaga oshirish)
//console.log(a + c); // Bu TypeError xatosini beradi: BigInt va boshqa turlarni aralashtirib bo'lmaydi, aniq o'zgartirishlardan foydalaning
console.log(a + BigInt(c)); // Output: 12n (BigInt + BigInt'ga o'zgartirilgan Number)
console.log(a > BigInt(c)); // Output: true (BigInt BigInt'ga o'zgartirilgan Number bilan taqqoslandi)
console.log(10n == 10); // Output: true
console.log(10n === 10); // Output: false
Qoldiqni Topish Operatori (%) va BigInt'lar
Qoldiqni topish operatori (%) BigInt'lar bilan to'g'ridan-to'g'ri ishlamaydi. Shunga o'xshash natijaga erishish uchun siz quyidagi yondashuvdan foydalanishingiz mumkin:
function bigIntModulo(dividend, divisor) {
return dividend - (divisor * (dividend / divisor));
}
const dividend = 25n;
const divisor = 7n;
console.log(bigIntModulo(dividend, divisor)); // Output: 4n
BigInt'ning Cheklovlari
BigInt muhim afzalliklarni taqdim etsa-da, uning cheklovlaridan xabardor bo'lish zarur:
- O'nli Kasrlarni Ifodalamaydi: BigInt'lar faqat butun sonlarni ifodalay oladi. Ular suzuvchi nuqtali arifmetika yoki o'nli nuqtali sonlarni ifodalash uchun ishlatilmaydi. Yuqori aniqlikdagi o'nli kasrlar bilan hisoblashlar uchun
decimal.js
yokibig.js
kabi kutubxonalardan foydalanishni ko'rib chiqing. - Number'lar bilan aralashtirish: Yuqorida aytib o'tilganidek, BigInt'lar va Number'lar o'rtasida to'g'ridan-to'g'ri arifmetik amallarga ruxsat berilmaydi. Siz Number'larni BigInt'larga aniq o'zgartirishingiz kerak, bu esa kodingizga murakkablik qo'shishi mumkin.
- Ishlash Tezligi: BigInt amallari, ayniqsa juda katta sonlar uchun standart Number amallaridan sekinroq bo'lishi mumkin. Buning sababi, BigInt arifmetikasi murakkabroq algoritmlar va xotirani boshqarishni talab qiladi. Ishlash tezligi muhim bo'lgan ilovalarda BigInt'dan foydalanganda uning tezligiga ta'sirini hisobga oling.
- JSON Serializatsiyasi: BigInt qiymatlari
JSON.stringify()
yordamida to'g'ridan-to'g'ri seriyalanmaydi. BigInt'ni to'g'ridan-to'g'ri seriyalashga urinish TypeError xatosiga olib keladi. Seriyalashdan oldin BigInt'ni satrga o'zgartirishingiz kerak.
JSON Serializatsiyasi uchun Muqobil Yechim
BigInt qiymatlarini JSON formatida seriyalash uchun siz toJSON
metodidan foydalanishingiz yoki ularni aniq satrlarga o'zgartirishingiz mumkin:
const bigIntValue = 12345678901234567890n;
// 1-usul: toJSON metodidan foydalanish
BigInt.prototype.toJSON = function() { return this.toString() };
const obj1 = { value: bigIntValue };
const jsonString1 = JSON.stringify(obj1);
console.log(jsonString1); // Output: {"value":"12345678901234567890"}
// 2-usul: Aniq satrga o'zgartirish
const obj2 = { value: bigIntValue.toString() };
const jsonString2 = JSON.stringify(obj2);
console.log(jsonString2); // Output: {"value":"12345678901234567890"}
//JSONni o'qiyotganda, uni qayta BigInt'ga o'zgartirish kerak bo'ladi.
const parsedObj = JSON.parse(jsonString2, (key, value) => {
if (typeof value === 'string' && /^[0-9]+$/.test(value)) {
try {
return BigInt(value);
} catch (e) {
return value; // BigInt satri emas
}
}
return value;
});
console.log(parsedObj.value); //Output: 12345678901234567890n
console.log(typeof parsedObj.value); //Output: bigint
BigInt'ning Amaliy Qo'llanilish Holatlari
BigInt'lar katta butun sonlar bilan aniq hisoblashlar muhim bo'lgan holatlarda qimmatlidir. Quyida uning asosiy qo'llanilish holatlari keltirilgan:
- Kriptografiya: Kriptografik algoritmlar ko'pincha juda katta tub sonlar bilan hisoblashlarni o'z ichiga oladi. BigInt'lar ushbu algoritmlarni to'g'ri amalga oshirish uchun zarur. Misollar qatoriga RSA shifrlash, Diffie-Hellman kalit almashinuvi va elliptik egri chiziqli kriptografiya kiradi. Masalan, RSA uchun katta tub sonlarni yaratish juda katta sonlarning tubligini tekshirishni o'z ichiga oladi va bu vazifada BigInt juda muhim.
- Moliyaviy Ilovalar: Katta pul miqdorlari bilan ishlash yoki murakkab moliyaviy hisob-kitoblarni amalga oshirish yaxlitlash xatolariga yo'l qo'ymaslik uchun yuqori aniqlikni talab qiladi. BigInt'lar pul qiymatlarining, ayniqsa xalqaro valyutalar va tranzaksiyalar bilan shug'ullanadigan tizimlarda, to'g'ri ifodalanishini ta'minlay oladi. Katta miqdordagi kredit bo'yicha uzoq muddatli foizlarni hisoblashni tasavvur qiling; BigInt kerakli aniqlikni saqlab qola oladi.
- Ilmiy Hisoblashlar: Ilmiy simulyatsiyalar va hisob-kitoblar ko'pincha juda katta yoki juda kichik sonlar bilan ishlashni o'z ichiga oladi. BigInt'lar ilmiy modellar va simulyatsiyalarda katta butun sonli qiymatlarni ifodalash uchun ishlatilishi mumkin. Bunga faktoriallarni hisoblash, zarrachalar o'zaro ta'sirini simulyatsiya qilish va astronomik hodisalarni modellashtirish kiradi.
- Blokcheyn Texnologiyasi: Blokcheyn tranzaksiyalari va kriptografik xesh funksiyalari asosan katta butun sonli arifmetikaga tayanadi. BigInt'lar blokcheyn tizimlarida tranzaksiya miqdorlari, blok balandliklari va boshqa muhim ma'lumotlar elementlarini ifodalash uchun ishlatiladi. Ethereum blokcheynini ko'rib chiqing, u yerda gaz narxlari va tranzaksiya to'lovlari ko'pincha juda katta butun sonlar sifatida ifodalanadi.
- Yuqori Aniqlikdagi Hisoblashlar: Number turining chegaralaridan tashqarida aniq butun sonli ifodalashni talab qiladigan har qanday ilova BigInt'dan foyda ko'rishi mumkin. Bunga sonlar nazariyasi, kombinatorik matematika va o'yinlarni ishlab chiqish kabi sohalardagi ilovalar kiradi.
BigInt va Brauzerlar Muvofiqligi
BigInt JavaScript'ga nisbatan yaqinda qo'shilgan, shuning uchun loyihalaringizda undan foydalanganda brauzer muvofiqligini hisobga olish muhim. Ko'pgina zamonaviy brauzerlar, jumladan Chrome, Firefox, Safari va Edge BigInt'ni qo'llab-quvvatlaydi. Biroq, eski brauzerlar tabiiy qo'llab-quvvatlashni ta'minlamasligi mumkin. Siz muvofiqlikni caniuse.com kabi manbalar yordamida tekshirishingiz mumkin.
Eski brauzerlarga mo'ljallangan loyihalar uchun BigInt qo'llab-quvvatlashini ta'minlash uchun polifill yoki Babel kabi transpilyatordan foydalanishni o'ylab ko'rishingiz mumkin. Polifill BigInt'ni tabiiy ravishda qo'llab-quvvatlamaydigan brauzerlar uchun JavaScript'da yozilgan implementatsiyasini taqdim etadi, transpilyator esa sizning BigInt'li kodingizni eski muhitlarda ishlaydigan ekvivalent kodga o'zgartiradi.
BigInt'dan Foydalanishning Eng Yaxshi Amaliyotlari
JavaScript loyihalaringizda BigInt'lardan samarali foydalanish uchun quyidagi eng yaxshi amaliyotlarni inobatga oling:
- BigInt'dan faqat zarur bo'lganda foydalaning: Agar sizga
Number.MAX_SAFE_INTEGER
dan kattaroq butun sonlarni ifodalash yoki yuqori aniqlik kerak bo'lmasa, BigInt'dan foydalanishdan saqlaning. BigInt'ni keraksiz ishlatish ishlash tezligining pasayishiga olib kelishi mumkin. - Number'larni BigInt'larga aniq o'zgartiring: Arifmetik amallarni bajarishdan oldin har doim Number'larni
BigInt()
konstruktori yordamida BigInt'larga aniq o'zgartiring. Bu tasodifiy turdagi xatolarning oldini olishga yordam beradi va hisob-kitoblaringiz to'g'ri bajarilishini ta'minlaydi. - Bo'lish xususiyatini yodda tuting: Yodingizda bo'lsin, BigInt'lar orasidagi bo'lish amali nolga qarab yaxlitlaydi. Agar qoldiqlar bilan ishlashingiz kerak bo'lsa,
bigIntModulo
funksiyasi yoki shunga o'xshash yondashuvdan foydalaning. - Ishlash tezligiga ta'sirini hisobga oling: BigInt amallari, ayniqsa juda katta sonlar uchun Number amallaridan sekinroq bo'lishi mumkin. Potentsial ishlashdagi muammolarni aniqlash uchun kodingizni sinchkovlik bilan sinovdan o'tkazing va BigInt'dan foydalanishni optimallashtiring.
- JSON serializatsiyasini ehtiyotkorlik bilan bajaring: BigInt qiymatlarini JSON formatiga seriyalashdan oldin ularni satrlarga o'zgartirishni va JSON'ni o'qiyotganda ularni qayta BigInt'ga o'zgartirishni unutmang.
- Aniq va tavsiflovchi o'zgaruvchi nomlaridan foydalaning: BigInt'lar bilan ishlaganda, qiymatning BigInt ekanligini aniq ko'rsatuvchi o'zgaruvchi nomlaridan foydalaning. Bu kodning o'qilishini yaxshilashga va chalkashliklarning oldini olishga yordam beradi. Masalan,
largeValueBigInt
yokiuserIdBigInt
kabi nomlardan foydalaning. - Kodingizni hujjatlashtiring: Nima uchun BigInt'lardan foydalanayotganingizni tushuntirish va BigInt hisob-kitoblaringizning chalkash bo'lishi mumkin bo'lgan har qanday jihatlarini aniqlashtirish uchun kodingizga izohlar qo'shing.
Xulosa
JavaScript'ning BigInt ma'lumot turi katta butun sonli hisoblashlarni aniqlik bilan bajarish uchun kuchli yechim taqdim etadi. Uning xususiyatlarini, cheklovlarini va eng yaxshi amaliyotlarini tushunib, siz BigInt'lardan kriptografiya va moliyaviy modellashtirishdan tortib ilmiy hisoblashlar va blokcheyn texnologiyasigacha bo'lgan keng ko'lamli ilovalarda samarali foydalanishingiz mumkin. Ishlash tezligi va muvofiqlik bilan bog'liq mulohazalar mavjud bo'lsa-da, katta butun sonlarni aniq ifodalashning afzalliklari ko'pincha kamchiliklardan ustun turadi, ayniqsa aniqlik birinchi darajada muhim bo'lgan holatlarda. Kutilmagan xatolarga yo'l qo'ymaslik uchun har doim Number va BigInt turlari o'rtasida aniq konvertatsiya qilishni va JSON seriyalizatsiyasini ehtiyotkorlik bilan bajarishni unutmang. JavaScript rivojlanishda davom etar ekan, BigInt, shubhasiz, dasturchilarga murakkab raqamli muammolarni ishonch va aniqlik bilan hal qilishda tobora muhim rol o'ynaydi.