Avastage JavaScripti BigInt suurte arvude tÀpseks kÀsitlemiseks. Lugege aritmeetiliste tehete, piirangute ja reaalsete kasutusjuhtude kohta.
JavaScripti BigInt-aritmeetika: suurte arvude arvutused ja tÀpsuse haldamine
Vaikimisi kasutab JavaScript numbriliste vÀÀrtuste esitamiseks andmetĂŒĂŒpi Number. Kuigi see on paljude kasutusjuhtude jaoks piisav, on Number-tĂŒĂŒbil piirangud vĂ€ga suurte tĂ€isarvude tĂ€psel esitamisel selle aluseks oleva topelttĂ€psusega ujukomaformaadi (IEEE 754) tĂ”ttu. See vĂ”ib pĂ”hjustada tĂ€psuse kadu ja ootamatuid tulemusi, kui tegeletakse arvudega, mis ĂŒletavad selle maksimaalset turvalist tĂ€isarvu (Number.MAX_SAFE_INTEGER), mis on 253 - 1.
Siin tuleb mĂ€ngu BigInt, ES2020-s tutvustatud sisseehitatud JavaScripti andmetĂŒĂŒp, mis on spetsiaalselt loodud suvalise pikkusega tĂ€isarvude esitamiseks. BigInt vĂ”imaldab teil teha aritmeetilisi tehteid eriti suurte arvudega ilma tĂ€psust kaotamata. See avab vĂ”imalusi arvutusteks sellistes valdkondades nagu krĂŒptograafia, teadusarvutused ja finantsrakendused, kus tĂ€psus on esmatĂ€htis.
Mis on BigInt?
BigInt on primitiivne andmetĂŒĂŒp, mis esindab tĂ€isarve, mis on suuremad kui Number-tĂŒĂŒp suudab tĂ€pselt kĂ€sitleda. Erinevalt Number-tĂŒĂŒbist ei ole BigInt-idel fikseeritud suurust, mis tĂ€hendab, et nad vĂ”ivad kasvada mis tahes tĂ€isarvu mahutamiseks, piiratud ainult vaba mĂ€luga.
BigInt-ide loomine
JavaScriptis on kaks peamist viisi BigInt-ide loomiseks:
n
-i lisamine tÀisarvu literaalile: See on kÔige otsem meetod. Lihtsalt lisage jÀrelliide 'n' arvu lÔppu. NÀiteks:12345678901234567890n
.BigInt()
konstruktori kasutamine: Saate kasutadaBigInt()
konstruktorit, et teisendada Number, sÔne vÔi teine BigInt BigInt-vÀÀrtuseks. NÀiteks:BigInt(12345)
vÔiBigInt("12345678901234567890")
. Pange tĂ€hele, et ujukomaarvu teisendamine BigInt-iks kĂ€rbib komaosa; see ei ĂŒmarda.
NĂ€ide:
const largeNumberLiteral = 9007199254740991n; // 'n' jÀrelliide kasutamine
const largeNumberConstructor = BigInt(9007199254740991); // BigInt() konstruktori kasutamine
const stringBasedBigInt = BigInt("1234567890123456789012345"); // SÔnest loomine
console.log(largeNumberLiteral); // VĂ€ljund: 9007199254740991n
console.log(largeNumberConstructor); // VĂ€ljund: 9007199254740991n
console.log(stringBasedBigInt); // VĂ€ljund: 1234567890123456789012345n
BigInt-aritmeetika tehted
BigInt-id toetavad standardseid aritmeetilisi tehteid nagu liitmine, lahutamine, korrutamine, jagamine ja astendamine. Siiski on olulisi aspekte, mida meeles pidada:
- SegatĂŒĂŒbiline aritmeetika ei ole lubatud: Te ei saa otse teha aritmeetilisi tehteid BigInt-ide ja Number-tĂŒĂŒpide vahel. Enne arvutuste tegemist peate Number-tĂŒĂŒbid selgesĂ”naliselt teisendama BigInt-ideks, kasutades
BigInt()
konstruktorit. See on disainivalik, et vÀltida tahtmatut tÀpsuse kadu. - Jagamise kÀitumine: BigInt-ide vaheline jagamine kÀrbib tulemuse nulli suunas, jÀttes kÔrvale murdosa. Puudub jÀÀgiga jagamise operaatori (%) ekvivalent, mis tagastaks murdosa jÀÀgi.
- VÔrdlusoperaatorid: Standardsed vÔrdlusoperaatorid (
==
,===
,<
,>
,<=
,>=
) töötavad BigInt-ide ja Number-tĂŒĂŒpide vahel. Pange tĂ€hele, et==
teostab tĂŒĂŒbi teisenduse, samas kui===
tagastab vale (false), kui vĂ”rdlete BigInt-i Number-tĂŒĂŒbiga.
Aritmeetiliste tehete nÀited
const a = 10n;
const b = 5n;
const c = 2;
console.log(a + b); // VĂ€ljund: 15n (BigInt + BigInt)
console.log(a - b); // VĂ€ljund: 5n (BigInt - BigInt)
console.log(a * b); // VĂ€ljund: 50n (BigInt * BigInt)
console.log(a / b); // VÀljund: 2n (BigInt / BigInt, kÀrpimine nulli suunas)
console.log(a ** b); // VĂ€ljund: 100000n (BigInt astendamine)
//console.log(a + c); // See viskab TypeError'i: Ei saa segada BigInt-i ja teisi tĂŒĂŒpe, kasutage selgesĂ”nalist teisendamist
console.log(a + BigInt(c)); // VĂ€ljund: 12n (BigInt + Number, mis on teisendatud BigInt-iks)
console.log(a > BigInt(c)); // VĂ€ljund: true (BigInt vĂ”rrelduna Number-tĂŒĂŒbiga, mis on teisendatud BigInt-iks)
console.log(10n == 10); // VĂ€ljund: true
console.log(10n === 10); // VĂ€ljund: false
JÀÀgiga jagamise operaator (%) ja BigInt-id
JÀÀgiga jagamise operaator (%) ei tööta otse BigInt-idega. Sarnase tulemuse saavutamiseks vÔite kasutada jÀrgmist lÀhenemist:
function bigIntModulo(dividend, divisor) {
return dividend - (divisor * (dividend / divisor));
}
const dividend = 25n;
const divisor = 7n;
console.log(bigIntModulo(dividend, divisor)); // VĂ€ljund: 4n
BigInt-i piirangud
Kuigi BigInt pakub olulisi eeliseid, on oluline olla teadlik selle piirangutest:
- Komaarvude esitus puudub: BigInt-id saavad esindada ainult tÀisarve. Neid ei saa kasutada ujukomaaritmeetikas ega komakohtadega arvude esitamiseks. Suure tÀpsusega komaarvude arvutamiseks kaaluge teekide nagu
decimal.js
vÔibig.js
kasutamist. - Segamine Number-tĂŒĂŒpidega: Nagu varem mainitud, ei ole otsesed aritmeetilised tehted BigInt-ide ja Number-tĂŒĂŒpide vahel lubatud. Peate selgesĂ”naliselt teisendama Number-tĂŒĂŒbid BigInt-ideks, mis vĂ”ib teie koodile keerukust lisada.
- JÔudlus: BigInt-tehted vÔivad olla aeglasemad kui standardsed Number-tehted, eriti vÀga suurte arvude puhul. See on tingitud sellest, et BigInt-aritmeetika nÔuab keerukamaid algoritme ja mÀluhaldust. Kaaluge jÔudlusmÔjusid, kui kasutate BigInt-i jÔudluskriitilistes rakendustes.
- JSON-serialiseerimine: BigInt-vÀÀrtusi ei saa otse serialiseerida, kasutades
JSON.stringify()
. BigInt-i otse serialiseerimise katse tulemuseks on TypeError. Enne serialiseerimist peate BigInt-i teisendama sÔneks.
JSON-serialiseerimise lahendus
BigInt-vÀÀrtuste serialiseerimiseks JSON-is saate kasutada toJSON
meetodit vÔi teisendada need selgesÔnaliselt sÔnedeks:
const bigIntValue = 12345678901234567890n;
// 1. meetod: toJSON meetodi kasutamine
BigInt.prototype.toJSON = function() { return this.toString() };
const obj1 = { value: bigIntValue };
const jsonString1 = JSON.stringify(obj1);
console.log(jsonString1); // VĂ€ljund: {"value":"12345678901234567890"}
// 2. meetod: SelgesÔnaline teisendamine sÔneks
const obj2 = { value: bigIntValue.toString() };
const jsonString2 = JSON.stringify(obj2);
console.log(jsonString2); // VĂ€ljund: {"value":"12345678901234567890"}
//Parsimisel tuleb see tagasi BigInt-iks teisendada.
const parsedObj = JSON.parse(jsonString2, (key, value) => {
if (typeof value === 'string' && /^[0-9]+$/.test(value)) {
try {
return BigInt(value);
} catch (e) {
return value; // Ei ole BigInt-sÔne
}
}
return value;
});
console.log(parsedObj.value); //VĂ€ljund: 12345678901234567890n
console.log(typeof parsedObj.value); //VĂ€ljund: bigint
BigInt-i reaalsed kasutusjuhud
BigInt-id on vÀÀrtuslikud stsenaariumides, kus tÀpsed arvutused suurte tÀisarvudega on kriitilise tÀhtsusega. Siin on mÔned silmapaistvad kasutusjuhud:
- KrĂŒptograafia: KrĂŒptograafilised algoritmid hĂ”lmavad sageli arvutusi erakordselt suurte algarvudega. BigInt-id on nende algoritmide tĂ€pseks rakendamiseks hĂ€davajalikud. NĂ€ideteks on RSA krĂŒpteerimine, Diffie-Hellmani vĂ”tmevahetus ja elliptilise kĂ”vera krĂŒptograafia. NĂ€iteks suurte algarvude genereerimine RSA jaoks hĂ”lmab vĂ€ga suurte arvude algarvulisuse kontrollimist, mis on ĂŒlesanne, kus BigInt on ĂŒlioluline.
- Finantsrakendused: Suurte rahasummade kĂ€sitlemine vĂ”i keerukate finantsarvutuste tegemine nĂ”uab suurt tĂ€psust ĂŒmardamisvigade vĂ€ltimiseks. BigInt-id vĂ”ivad tagada rahaliste vÀÀrtuste tĂ€pse esitamise, eriti sĂŒsteemides, mis tegelevad rahvusvaheliste valuutade ja tehingutega. Kujutage ette intressi arvutamist pika perioodi jooksul vĂ€ga suurel laenul; BigInt suudab sĂ€ilitada vajaliku tĂ€psuse.
- Teadusarvutused: Teaduslikud simulatsioonid ja arvutused hÔlmavad sageli vÀga suurte vÔi vÀga vÀikeste arvudega tegelemist. BigInt-e saab kasutada suurte tÀisarvude esitamiseks teaduslikes mudelites ja simulatsioonides. NÀideteks on faktoriaalide arvutamine, osakeste interaktsioonide simuleerimine ja astronoomiliste nÀhtuste modelleerimine.
- Plokiahela tehnoloogia: Plokiahela tehingud ja krĂŒptograafilised rĂ€sifunktsioonid toetuvad suuresti suurte tĂ€isarvude aritmeetikale. BigInt-e kasutatakse tehingusummade, plokkide kĂ”rguste ja muude kriitiliste andmeelementide esitamiseks plokiahela sĂŒsteemides. MĂ”elge Ethereumi plokiahelale, kus gaasihinnad ja tehingutasud vĂ€ljendatakse sageli vĂ€ga suurte tĂ€isarvudena.
- Suure tĂ€psusega arvutused: Iga rakendus, mis nĂ”uab tĂ€pset tĂ€isarvu esitust vĂ€ljaspool Number-tĂŒĂŒbi piire, vĂ”ib BigInt-ist kasu saada. See hĂ”lmab rakendusi sellistes valdkondades nagu arvuteooria, kombinatoorne matemaatika ja mĂ€nguarendus.
BigInt ja brauserite ĂŒhilduvus
BigInt on JavaScripti suhteliselt uus lisandus, seega on oluline arvestada brauserite ĂŒhilduvusega, kui seda oma projektides kasutate. Enamik kaasaegseid brausereid toetab BigInt-i, sealhulgas Chrome, Firefox, Safari ja Edge. Vanemad brauserid aga ei pruugi pakkuda natiivset tuge. Ăhilduvust saate kontrollida ressursside abil nagu caniuse.com.
Vanematele brauseritele suunatud projektide puhul vĂ”iksite kaaluda polĂŒfĂŒlli vĂ”i transpilaatori nagu Babel kasutamist, et pakkuda BigInt-i tuge. PolĂŒfĂŒll pakub BigInt-i JavaScripti implementatsiooni brauseritele, mis seda natiivselt ei toeta, samas kui transpilaator teisendab teie BigInt-idega koodi samavÀÀrseks koodiks, mis töötab vanemates keskkondades.
BigInt-i kasutamise parimad tavad
BigInt-ide tÔhusaks kasutamiseks oma JavaScripti projektides kaaluge jÀrgmisi parimaid tavasid:
- Kasutage BigInt-i ainult siis, kui see on vajalik: VÀltige BigInt-i kasutamist, kui te ei pea spetsiaalselt esindama tÀisarve, mis on suuremad kui
Number.MAX_SAFE_INTEGER
, vĂ”i ei vaja suurt tĂ€psust. BigInt-i asjatu kasutamine vĂ”ib pĂ”hjustada jĂ”udluse vĂ€henemist. - Teisendage Number-tĂŒĂŒbid selgesĂ”naliselt BigInt-ideks: Teisendage Number-tĂŒĂŒbid alati selgesĂ”naliselt BigInt-ideks, kasutades
BigInt()
konstruktorit enne aritmeetiliste tehete tegemist. See aitab vĂ€ltida juhuslikke tĂŒĂŒbivigu ja tagab, et teie arvutused tehakse Ă”igesti. - Olge teadlik jagamise kĂ€itumisest: Pidage meeles, et BigInt-ide vaheline jagamine kĂ€rbib tulemuse nulli suunas. Kui peate kĂ€sitlema jÀÀke, kasutage
bigIntModulo
funktsiooni vÔi sarnast lÀhenemist. - Kaaluge jÔudlusmÔjusid: BigInt-tehted vÔivad olla aeglasemad kui Number-tehted, eriti vÀga suurte arvude puhul. Testige oma koodi pÔhjalikult, et tuvastada potentsiaalsed jÔudluse kitsaskohad ja optimeerida oma BigInt-i kasutust.
- KÀsitlege JSON-serialiseerimist hoolikalt: Pidage meeles, et BigInt-vÀÀrtused tuleb enne JSON-i serialiseerimist teisendada sÔnedeks ja JSON-i parsimisel tagasi BigInt-ideks teisendada.
- Kasutage selgeid ja kirjeldavaid muutujate nimesid: BigInt-idega töötades kasutage muutujate nimesid, mis viitavad selgelt, et vÀÀrtus on BigInt. See aitab parandada koodi loetavust ja vÀltida segadust. NÀiteks kasutage nimesid nagu
largeValueBigInt
vÔiuserIdBigInt
. - Dokumenteerige oma kood: Lisage oma koodile kommentaare, et selgitada, miks te kasutate BigInt-e ja selgitada kÔiki potentsiaalselt segadust tekitavaid aspekte oma BigInt-arvutustes.
KokkuvÔte
JavaScripti BigInt-andmetĂŒĂŒp pakub vĂ”imsat lahendust suurte tĂ€isarvude tĂ€pseks arvutamiseks. MĂ”istes selle omadusi, piiranguid ja parimaid tavasid, saate BigInt-e tĂ”husalt kasutada laias valikus rakendustes, alates krĂŒptograafiast ja finantsmodelleerimisest kuni teadusarvutuste ja plokiahela tehnoloogiani. Kuigi on jĂ”udluse ja ĂŒhilduvusega seotud kaalutlusi, kaaluvad tĂ€pse suurte tĂ€isarvude esitamise eelised sageli ĂŒles puudused, eriti olukordades, kus tĂ€psus on esmatĂ€htis. Pidage alati meeles, et ootamatute vigade vĂ€ltimiseks tuleb Number- ja BigInt-tĂŒĂŒpide vahel selgesĂ”naliselt teisendada ning JSON-serialiseerimist hoolikalt kĂ€sitleda. JavaScripti arenedes mĂ€ngib BigInt kahtlemata ĂŒha olulisemat rolli, vĂ”imaldades arendajatel enesekindlalt ja tĂ€pselt lahendada keerulisi numbrilisi vĂ€ljakutseid.