Js generator de numere aleatoare. Sortarea structurii asemănătoare JSON. Fixarea unui număr într-un interval

De foarte multe ori, calculele în JavaScript nu dau exact rezultatele pe care ni le dorim. Desigur, putem face ce vrem cu numere - rotunjim în sus sau în jos, setați intervale, tăiați numerele inutile la un anumit număr de zecimale, totul depinde de ce doriți să faceți cu acest număr în viitor. De ce este necesară rotunjirea? Unul dintre aspectele interesante ale JavaScript este că de fapt nu stochează numere întregi, lucrăm imediat cu numere în virgulă mobilă. Acest lucru, combinat cu faptul că multe valori fracționale nu pot fi exprimate într-un număr finit de zecimale, în JavaScript putem obține rezultate ca acestea:

0.1 * 0.2; > 0.020000000000000004 0.3 - 0.1 > 0.19999999999999998
În scopuri practice, această inexactitate nu contează, în cazul nostru vorbim despre o eroare în chintilioane de piese, totuși, acest lucru poate dezamăgi pe unii. De asemenea, putem obține rezultate oarecum ciudate atunci când lucrăm cu numere care reprezintă monede, procente sau dimensiuni de fișiere. Pentru a corecta aceste inexactități, trebuie doar să putem rotunji rezultatele și este suficient să setăm precizia zecimală.

Rotunjirea numerelor are uz practic, este posibil să manipulăm un număr într-un anumit interval, de exemplu, dorim să rotunjim valoarea la cel mai apropiat număr întreg, în loc să lucrăm doar cu partea zecimală.

Rotunjirea numerelor zecimale Pentru a tăia numar decimal, utilizați metoda toFixed sau toPrecision. Ambele au un singur argument care specifică, respectiv, câte cifre semnificative (adică numărul total de cifre utilizate în număr) sau zecimale (numărul după virgulă) rezultatul ar trebui să includă:
  • Dacă un argument nu este definit pentru toFixed() atunci acesta va fi implicit egal cu zero, ceea ce înseamnă 0 zecimale, argumentul are o valoare maximă de 20.
  • Dacă toPrecision nu i se oferă niciun argument, numărul este lăsat neatins
  • fie randNum = 6,25; randNum.toFixed(); > „6” Math.PI.toPrecision(1); > "3" randNum = 87,335; randNum.toFixed(2); > "87,33" randNum = 87,337; randNum.toPrecision(3); > "87,3"
    Ambele metode toFixed() și toPrecision() returnează o reprezentare șir a rezultatului, nu un număr. Aceasta înseamnă că atunci când însumăm o valoare rotunjită cu randNum, va produce o concatenare de șiruri de caractere mai degrabă decât o sumă de numere:

    Fie randNum = 6,25; let rounded = randNum.toFixed(); // "6" console.log(randNum + rotunjit); > „6.256”
    Dacă vrei ca rezultatul să fie tip numeric date, atunci va trebui să aplicați parseFloat:

    Fie randNum = 6,25; let rounded = parseFloat(randNum.toFixed(1)); console.log(rotunjit); > 6.3
    Vă rugăm să rețineți că valorile de 5 sunt rotunjite, cu excepția cazurilor rare.

    Metodele toFixed() și toPrecision() sunt utile, deoarece nu numai că pot tăia partea fracțională, ci și pot adăuga zecimale, ceea ce este convenabil când lucrați cu moneda:

    Let wholeNum = 1 let dollarsCents = wholeNum.toFixed(2); console.log(dollarsCents); > „1.00”
    Rețineți că toPrecision va produce rezultatul în notație științifică dacă numărul de numere întregi este mai mare decât precizia în sine:

    Fie num = 123,435 num.toPrecision(2); > „1.2e+2”

    Cum să evitați erorile de rotunjire cu zecimale În unele cazuri, toFixed și toPrecision rotunjesc valoarea 5 în jos și în sus:

    Fie numTest = 1,005; numTest.toFixed(2); > "1.00"
    Rezultatul calculului de mai sus ar fi trebuit să fie 1,01, nu 1. Dacă doriți să evitați eroare similară, putem folosi soluția propusă de Jack L Moore, care folosește numere exponențiale pentru a calcula:

    Funcția rotund(valoare, zecimale) ( returnează Număr(Math.round(valoare+"e"+zecimale)+"e-"+zecimale); )
    Acum:

    Rotunzi (1,005,2); > 1.01
    Dacă doriți o soluție mai robustă decât cea prezentată mai sus, puteți merge la MDN.

    Rotunjirea epsilonului automat O metodă alternativă pentru rotunjirea numerelor zecimale a fost introdusă în ES6. Rotunjirea epsilonului mașinii oferă o marjă rezonabilă de eroare atunci când se compară două numere în virgulă mobilă. Fără rotunjire, comparațiile pot produce rezultate similare cu următoarele:

    0,1 + 0,2 === 0,3 > fals
    Folosim Math.EPSILON în funcția noastră pentru a obține o comparație validă:

    Funcția epsEqu(x, y) ( returnează Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
    Funcția are două argumente: primul este calculul curent, al doilea este rezultatul așteptat. Acesta returnează o comparație a celor două:

    EpsEqu(0,1 + 0,2, 0,3) > adevărat
    Toate browserele moderne acceptă deja ES6 functii matematice dar dacă doriți suport în browsere precum IE 11, utilizați polyfills.

    Tăierea părții fracționale Toate metodele prezentate mai sus se pot rotunji la numere zecimale. Pentru a tăia pur și simplu un număr la două zecimale, trebuie mai întâi să-l înmulțiți cu 100 și apoi să împărțiți rezultatul rezultat la 100:

    Funcția trunchiat(num) ( return Math.trunc(num * 100) / 100; ) trunchiat(3.1416) > 3.14
    Dacă doriți să adaptați metoda la orice număr de zecimale, puteți utiliza negația dublă pe biți:

    Funcția trunchiată(num, decimalPlaces) (let numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )
    Acum:

    Fie randInt = 35,874993; trunchiat(randInt,3); > 35.874

    Rotunjirea la cel mai apropiat număr Pentru a rotunji un număr zecimal la cel mai apropiat număr în sus sau în jos, oricare dintre ele ne aflăm cel mai aproape, utilizați Math.round():

    Math.round(4.3) > 4 Math.round(4.5) > 5
    Rețineți că „jumătate din valoare”, 0,5 este rotunjit la latura mare conform regulilor matematicii.

    Rotunjirea în jos la cel mai apropiat număr întreg Dacă doriți să rotunjiți întotdeauna în jos, utilizați Math.floor:

    Math.floor(42,23); > 42 Math.floor(36,93); > 36
    Vă rugăm să rețineți că rotunjirea în jos funcționează pentru toate numerele, inclusiv pentru numerele negative. Imaginați-vă un zgârie-nori cu un număr infinit de etaje, inclusiv etaje la nivelul de jos (reprezentând numere negative). Dacă vă aflați într-un lift la cel mai jos nivel între 2 și 3 (care reprezintă o valoare de -2,5), Math.floor vă va duce la -3:

    Math.floor(-2,5); > -3
    Dar daca vrei sa eviti situație similară, utilizați Math.trunc , acceptat în toate browsere moderne(cu excepția IE/Edge):

    Math.trunc(-41,43); > -41
    Pe MDN veți găsi un polyfill care va oferi suport pentru Math.trunc în browsere și IE/Edge.

    Rotunjirea la cel mai apropiat număr întreg Pe de altă parte, dacă întotdeauna trebuie să rotunjiți în sus, utilizați Math.ceil. Din nou, amintiți-vă de liftul infinit: Math.ceil va merge întotdeauna „în sus”, indiferent dacă numărul este negativ sau nu:

    Math.ceil(42,23); > 43 Math.ceil(36,93); > 37 Math.ceil(-36,93); > -36

    Rotunjirea în sus/în jos la numărul necesar Dacă dorim să rotunjim la cel mai apropiat multiplu de 5, cel mai simplu mod este de a crea o funcție care împarte numărul la 5, îl rotunjește și apoi îl înmulțește cu aceeași sumă:

    Funcția roundTo5(num) ( returnează Math.round(num/5)*5; )
    Acum:

    RoundTo5(11); > 10
    Dacă doriți să rotunjiți la multipli ai valorii dvs., folosim mai mult functia generala, trecând valoarea inițială și un multiplu în ea:

    Funcția roundToMultiple(num, multiple) ( returnează Math.round(num/multiple)*multiple; )
    Acum:

    Fie initialNumber = 11; fie multiplu = 10; roundToMultiple(initialNumber, multiple); > 10;

    Fixarea unui număr într-un interval Există multe cazuri în care dorim să obținem o valoare a lui x care se află într-un interval. De exemplu, s-ar putea să avem nevoie de o valoare între 1 și 100, dar am ajuns la o valoare de 123. Pentru a remedia acest lucru, putem folosi min (returnează cel mai mic dintr-un set de numere) și max (returnează cel mai mare dintre orice set). de numere). În exemplul nostru, intervalul este de la 1 la 100:

    Fie lowBound = 1; lasă highBound = 100; fie numInput = 123; let clamped = Math.max(lowBound, Math.min(numInput, highBound)); console.log(blocat); > 100;
    Din nou, putem reutiliza operația și înfășura totul într-o funcție, folosind soluția propusă de Daniel X. Moore:

    Number.prototype.clamp = function(min, max) ( return Math.min(Math.max(this, min), max); );
    Acum:

    NumInput.clamp(lowBound, highBound); > 100;

    Rotunjirea gaussiană Rotunjirea gaussiană, cunoscută și sub denumirea de rotunjire bancară, este locul în care rotunjirea pentru acest caz are loc la cel mai apropiat număr par. Această metodă de rotunjire funcționează fără erori statistice. Cea mai bună decizie a fost sugerat de Tim Down:

    Funcția gaussRound(num, decimalPlaces) ( fie d = decimalPlaces || 0, m = Math.pow(10, d), n = +(d ? num * m: num).toFixed(8), i = Math.floor (n), f = n - i, e = 1e-8, r = (f > 0,5 - e && f< 0.5 + e) ? ((i % 2 == 0) ? i: i + 1) : Math.round(n); return d ? r / m: r; }
    Acum:

    GaussRound(2,5) > 2 gaussRound(3,5) > 4 gaussRound(2,57,1) > 2,6
    Decimală în CSS:

    Deoarece JavaScript este adesea folosit pentru a crea mapări poziționale pentru elementele HTML, s-ar putea să vă întrebați ce s-ar întâmpla dacă am genera valori zecimale pentru elementele noastre:

    #box ( lățime: 63,667731993px; )
    Vestea bună este că browserele moderne vor respecta valorile zecimale în model bloc, inclusiv unități procentuale sau pixeli.

    Sortarea De foarte multe ori trebuie să sortăm unele elemente, de exemplu, avem o serie de înregistrări de joc și trebuie organizate în ordinea descrescătoare a rangului jucătorului. Din pacate, metoda standard sort() are câteva limitări surprinzătoare: funcționează bine cu cele utilizate frecvent în cuvinte englezești, dar se defectează imediat când întâlniți numere, caractere unice sau cuvinte cu majuscule. Filtrează după ordine alfabetică S-ar părea că sortarea unei matrice în ordine alfabetică ar trebui să fie o sarcină simplă:

    Lăsați fructe = [„dovleac”, „caise”, „gustalupe”]; fruct.sort(); > „caisă”, „dovleac”, „gustalup”]
    Cu toate acestea, ne confruntăm cu o problemă de îndată ce unul dintre elemente este cu majuscule:

    Lasa fructe = ["dovleac", "caise", "Cantalope"]; fruct.sort(); > „Cantalup”, „caise”, „dovleac”]
    Acest lucru se datorează faptului că, în mod implicit, sortatorul compară primul caracter reprezentat în Unicode. Unicode este cod unic pentru orice simbol, indiferent de platformă, indiferent de program, indiferent de limbă. De exemplu, dacă te uiți la tabelul de coduri, caracterul „a” are valoarea U+0061 (in sistem hexazecimal 0x61), în timp ce caracterul „C” are codul U+0043 (0x43), care apare mai devreme în tabelul Unicode decât caracterul „a”.

    Pentru a sorta o matrice care poate conține primele litere mixte cu majuscule, trebuie fie să convertim temporar toate elementele în minuscule, fie să definim ordinea noastră de sortare folosind metoda localeCompare() cu unele argumente. De regulă, pentru un astfel de caz, este mai bine să creați imediat o funcție pentru utilizare repetată:

    Funcția alphaSort(arr) ( arr.sort(function (a, b) ( return a.localeCompare(b, "en", ("sensibilitate": "bază")); )); ) let fruit = ["dovleac butternut „, „caisă”, „Cantalup”]; alphaSort(fructe) >
    Dacă doriți ca matricea să fie sortată în ordine alfabetică inversă, schimbați pur și simplu pozițiile lui a și b în funcție:

    Funcția alphaSort(arr) ( arr.sort(function (a, b) ( return b.localeCompare(a, "en", ("sensibilitate": "bază")); )); ) let fruit = ["dovleac butternut „, „caisă”, „Cantalup”]; alphaSort(fructe) > ["Cantalupe", "dovleac", "caise"]
    Aici este de remarcat faptul că localeCompare este folosit cu argumente, trebuie să ne amintim, de asemenea, că este suportat de IE11+, pentru versiunile mai vechi de IE, îl putem folosi fără argumente și cu litere mici:

    Funcția caseSort(arr) ( arr.sort(funcție (a, b) ( return a.toLowerCase().localeCompare(b.toLowerCase()); )); ) let fruit = ["dovleac", "caise", "Pepene galben"]; caseSort(fructe) > ["caise", "dovleac", "Cantalup"]

    Sortare numerică Toate acestea nu se aplică exemplului despre care am vorbit mai sus despre gama de înregistrări de joc. Cu unele matrice numerice, sortarea funcționează bine, dar la un moment dat rezultatul poate fi imprevizibil:

    Fie highScores = ; highScores.sort(); >
    Chestia este că metoda sort() realizează o comparație lexicografică: ceea ce înseamnă că numerele vor fi convertite într-un șir și comparațiile se vor face din nou prin potrivirea primului caracter al acelui șir în ordinea caracterelor din tabelul Unicode. . Prin urmare, trebuie să definim din nou ordinea noastră de sortare:

    Fie highScores = ; highScores.sort(funcție(a,b) ( returnează a - b; )); >
    Din nou, pentru a sorta numerele în ordine inversă, schimbați pozițiile lui a și b în funcție.

    Sortarea unei structuri asemănătoare JSON În sfârșit, dacă avem o structură de date asemănătoare JSON reprezentată ca o matrice de înregistrări de joc:

    Fiți scoruri = [ ( „nume”: „Daniel”, „scor”: 21768 ), ( „nume”: „Michael”, „scor”: 33579 ), ( „nume”: „Alison”, „scor”: 38395 ) ];
    În ES6+, puteți utiliza funcții de săgeți:

    Scores.sort((a, b) => b.score - a.score));
    Pentru browserele mai vechi care nu au acest suport:

    Scores.sort(funcție(a, b) ( returnează a.score - b.score ));
    După cum puteți vedea, sortarea în JavaScript este un lucru destul de obscur, sper că aceste exemple vor face cumva viața mai ușoară.

    Lucrul cu funcții de putere Exponentiația este o operație definită inițial ca rezultat al înmulțirii repetate a unui număr natural cu el însuși. Am putea folosi aceste funcții în mod constant în Viata de zi cu zi la lecțiile de matematică, inclusiv calcularea suprafețelor, volumelor sau chiar modelarea fizică.

    În JavaScript functie de putere introdus ca Math.pow(), a fost introdus în noul standard ES7 nou operator exponentiație - " * * ".

    Ridicarea la o putere Pentru a ridica un număr la a n-a putere, utilizați funcția Math.pow(), unde primul argument este numărul care va fi ridicat la putere, al doilea argument este exponentul:

    Math.pow(3,2) > 9
    Această formă de notație înseamnă 3 pătrat, sau 3 × 3, ceea ce duce la rezultatul 9. Un alt exemplu poate fi dat, desigur:

    Math.pow(5,3); > 125
    Adică, 5 cuburi, sau 5 × 5 × 5, este egal cu 125.

    ECMAScript 7 este următoarea versiune JavaScript, în principiu, putem folosi noul operator de exponențiere propus - * *, această formă de notație poate fi mai descriptivă:

    3 ** 2 > 9
    Pe acest moment Suportul pentru acest operator este destul de limitat, deci utilizarea lui nu este recomandată.

    Funcția de putere poate fi utilă în cele mai multe situatii diferite. Un exemplu simplu, calcularea numărului de secunde într-o oră: Math.pow (60,2).

    Rădăcina pătrată și cubă Math.sqrt() și Math.cbrt() sunt opusul Math.pow(). După cum ne amintim, rădăcina pătrată a lui a este numărul care dă a când este pătrat.

    Math.sqrt(9) > 3
    În același timp, rădăcina cubă a lui a este un număr care dă a atunci când este ridicat la un cub.

    Math.cbrt(125) > 5
    Math.cbrt() a fost introdus doar recent în specificația JavaScript și, prin urmare, este acceptat doar în browserele moderne: Chrome 38+, Firefox și Opera 25+ și Safari 7.1+. Vei observa asta Internet Explorer nu se află pe această listă, dar veți găsi un polyfill pe MDN.

    Exemple Desigur, putem folosi valori non-întregi în una dintre aceste funcții:

    Math.pow(1,25, 2); > 1,5625 Math.cbrt(56,57) > 3,8387991760286138
    Vă rugăm să rețineți că acest lucru funcționează destul de bine și atunci când utilizați valori negative ale argumentelor:

    Math.pow(-5,2) > 25 Math.pow(10,-2) > 0,01
    Cu toate acestea, acest lucru nu va funcționa pentru rădăcina pătrată:

    Math.sqrt(-9) > NaN
    Din analiză matematicăȘtim că prin număr imaginar înțelegem rădăcinile pătrate ale numerelor negative. Și asta ne poate conduce la o altă tehnică de lucru numere complexe, Dar asta este o altă poveste.

    Puteți folosi fracții în Math.pow() pentru a găsi rădăcinile pătrate și cubice ale numerelor. Rădăcină pătrată folosește exponentul 0,5:

    Math.pow(5, 0,5); // = Math.sqrt(5) = 5 ** (1/2) > 2,23606797749979
    Cu toate acestea, din cauza capricilor virgulă mobilă, nu puteți ghici exact rezultatul corect:

    Math.pow(2,23606797749979,2) > 5,000000000000001
    În astfel de situații, va trebui să recurgeți la tăierea semnelor din număr sau rotunjirea la o anumită valoare.

    Unii, de din motive necunoscute JavaScript confundă funcția Math.pow() cu Math.exp() , care este o funcție exponențială pentru numere în general. Notă: în Limba engleză„exponent” este tradus ca „exponent”, deci este mai probabil să se aplice vorbitorilor de engleză, deși există denumiri alternative pentru exponent, cum ar fi index, putere.

    Constante matematice Lucrul cu matematica în JavaScript este facilitat de un număr de constante încorporate. Aceste constante sunt proprietăți ale obiectului Math. Este de remarcat faptul că constantele sunt scrise cu majuscule, nu cu notația CamelCase.

    Numai utilizatorii înregistrați pot participa la sondaj. Intrati va rog.

    Etichete:
    • javascript
    • matematică
    Adăugați etichete Foarte des, calculele în JavaScript nu dau exact rezultatele pe care le dorim. Desigur, putem face ce vrem cu numere - rotunjim în sus sau în jos, setați intervale, tăiați numerele inutile la un anumit număr de zecimale, totul depinde de ce doriți să faceți cu acest număr în viitor. De ce este necesară rotunjirea? Unul dintre aspectele interesante ale JavaScript este că de fapt nu stochează numere întregi, lucrăm imediat cu numere în virgulă mobilă. Acest lucru, combinat cu faptul că multe valori fracționale nu pot fi exprimate într-un număr finit de zecimale, în JavaScript putem obține rezultate ca acestea:

    0.1 * 0.2; > 0.020000000000000004 0.3 - 0.1 > 0.19999999999999998
    În scopuri practice, această inexactitate nu contează, în cazul nostru vorbim despre o eroare în chintilioane de piese, totuși, acest lucru poate dezamăgi pe unii. De asemenea, putem obține rezultate oarecum ciudate atunci când lucrăm cu numere care reprezintă monede, procente sau dimensiuni de fișiere. Pentru a corecta aceste inexactități, trebuie doar să putem rotunji rezultatele și este suficient să setăm precizia zecimală.

    Rotunjirea numerelor are aplicații practice, putem manipula un număr într-un anumit interval, de exemplu, dorim să rotunjim o valoare la cel mai apropiat număr întreg, în loc să lucrăm doar cu partea zecimală.

    Rotunjirea zecimalelor Pentru a tăia o zecimală, utilizați metoda toFixed sau toPrecision. Ambele au un singur argument care specifică, respectiv, câte cifre semnificative (adică numărul total de cifre utilizate în număr) sau zecimale (numărul după virgulă) rezultatul ar trebui să includă:
  • Dacă un argument nu este definit pentru toFixed(), acesta va fi implicit la zero, ceea ce înseamnă 0 zecimale, argumentul are o valoare maximă de 20.
  • Dacă toPrecision nu i se oferă niciun argument, numărul este lăsat neatins
  • fie randNum = 6,25; randNum.toFixed(); > „6” Math.PI.toPrecision(1); > "3" randNum = 87,335; randNum.toFixed(2); > "87,33" randNum = 87,337; randNum.toPrecision(3); > "87,3"
    Ambele metode toFixed() și toPrecision() returnează o reprezentare șir a rezultatului, nu un număr. Aceasta înseamnă că atunci când însumăm o valoare rotunjită cu randNum, va produce o concatenare de șiruri de caractere mai degrabă decât o sumă de numere:

    Fie randNum = 6,25; let rounded = randNum.toFixed(); // "6" console.log(randNum + rotunjit); > „6.256”
    Dacă doriți ca rezultatul să fie un tip de date numerice, atunci va trebui să utilizați parseFloat:

    Fie randNum = 6,25; let rounded = parseFloat(randNum.toFixed(1)); console.log(rotunjit); > 6.3
    Vă rugăm să rețineți că valorile de 5 sunt rotunjite, cu excepția cazurilor rare.

    Metodele toFixed() și toPrecision() sunt utile, deoarece nu numai că pot tăia partea fracțională, ci și pot adăuga zecimale, ceea ce este convenabil când lucrați cu moneda:

    Let wholeNum = 1 let dollarsCents = wholeNum.toFixed(2); console.log(dollarsCents); > „1.00”
    Rețineți că toPrecision va produce rezultatul în notație științifică dacă numărul de numere întregi este mai mare decât precizia în sine:

    Fie num = 123,435 num.toPrecision(2); > „1.2e+2”

    Cum să evitați erorile de rotunjire cu zecimale În unele cazuri, toFixed și toPrecision rotunjesc valoarea 5 în jos și în sus:

    Fie numTest = 1,005; numTest.toFixed(2); > "1.00"
    Rezultatul calculului de mai sus ar fi trebuit să fie 1,01, nu 1. Dacă doriți să evitați o eroare similară, putem folosi soluția propusă de Jack L Moore, care folosește numere exponențiale pentru calcul:

    Funcția rotund(valoare, zecimale) ( returnează Număr(Math.round(valoare+"e"+zecimale)+"e-"+zecimale); )
    Acum:

    Rotunzi (1,005,2); > 1.01
    Dacă doriți o soluție mai robustă decât cea prezentată mai sus, puteți merge la MDN.

    Rotunjirea epsilonului automat O metodă alternativă pentru rotunjirea numerelor zecimale a fost introdusă în ES6. Rotunjirea epsilonului mașinii oferă o marjă rezonabilă de eroare atunci când se compară două numere în virgulă mobilă. Fără rotunjire, comparațiile pot produce rezultate similare cu următoarele:

    0,1 + 0,2 === 0,3 > fals
    Folosim Math.EPSILON în funcția noastră pentru a obține o comparație validă:

    Funcția epsEqu(x, y) ( returnează Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
    Funcția are două argumente: primul este calculul curent, al doilea este rezultatul așteptat. Acesta returnează o comparație a celor două:

    EpsEqu(0,1 + 0,2, 0,3) > adevărat
    Toate browserele moderne acceptă deja funcții matematice ES6, dar dacă doriți suport în browsere precum IE 11, utilizați polyfills.

    Tăierea părții fracționale Toate metodele prezentate mai sus se pot rotunji la numere zecimale. Pentru a tăia pur și simplu un număr la două zecimale, trebuie mai întâi să-l înmulțiți cu 100 și apoi să împărțiți rezultatul rezultat la 100:

    Funcția trunchiat(num) ( return Math.trunc(num * 100) / 100; ) trunchiat(3.1416) > 3.14
    Dacă doriți să adaptați metoda la orice număr de zecimale, puteți utiliza negația dublă pe biți:

    Funcția trunchiată(num, decimalPlaces) (let numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )
    Acum:

    Fie randInt = 35,874993; trunchiat(randInt,3); > 35.874

    Rotunjirea la cel mai apropiat număr Pentru a rotunji un număr zecimal la cel mai apropiat număr în sus sau în jos, oricare dintre ele ne aflăm cel mai aproape, utilizați Math.round():

    Math.round(4.3) > 4 Math.round(4.5) > 5
    Vă rugăm să rețineți că „jumătate din valoare”, 0,5 este rotunjit în sus conform regulilor matematicii.

    Rotunjirea în jos la cel mai apropiat număr întreg Dacă doriți să rotunjiți întotdeauna în jos, utilizați Math.floor:

    Math.floor(42,23); > 42 Math.floor(36,93); > 36
    Vă rugăm să rețineți că rotunjirea în jos funcționează pentru toate numerele, inclusiv pentru numerele negative. Imaginați-vă un zgârie-nori cu un număr infinit de etaje, inclusiv etaje la nivelul de jos (reprezentând numere negative). Dacă vă aflați într-un lift la cel mai jos nivel între 2 și 3 (care reprezintă o valoare de -2,5), Math.floor vă va duce la -3:

    Math.floor(-2,5); > -3
    Dar dacă doriți să evitați această situație, utilizați Math.trunc, acceptat în toate browserele moderne (cu excepția IE/Edge):

    Math.trunc(-41,43); > -41
    Pe MDN veți găsi un polyfill care va oferi suport pentru Math.trunc în browsere și IE/Edge.

    Rotunjirea la cel mai apropiat număr întreg Pe de altă parte, dacă întotdeauna trebuie să rotunjiți în sus, utilizați Math.ceil. Din nou, amintiți-vă de liftul infinit: Math.ceil va merge întotdeauna „în sus”, indiferent dacă numărul este negativ sau nu:

    Math.ceil(42,23); > 43 Math.ceil(36,93); > 37 Math.ceil(-36,93); > -36

    Rotunjirea în sus/în jos la numărul necesar Dacă dorim să rotunjim la cel mai apropiat multiplu de 5, cel mai simplu mod este de a crea o funcție care împarte numărul la 5, îl rotunjește și apoi îl înmulțește cu aceeași sumă:

    Funcția roundTo5(num) ( returnează Math.round(num/5)*5; )
    Acum:

    RoundTo5(11); > 10
    Dacă doriți să rotunjiți la multipli ai valorii dvs., folosim o funcție mai generală, trecând valoarea inițială și multiplu:

    Funcția roundToMultiple(num, multiple) ( returnează Math.round(num/multiple)*multiple; )
    Acum:

    Fie initialNumber = 11; fie multiplu = 10; roundToMultiple(initialNumber, multiple); > 10;

    Fixarea unui număr într-un interval Există multe cazuri în care dorim să obținem o valoare a lui x care se află într-un interval. De exemplu, s-ar putea să avem nevoie de o valoare între 1 și 100, dar am ajuns la o valoare de 123. Pentru a remedia acest lucru, putem folosi min (returnează cel mai mic dintr-un set de numere) și max (returnează cel mai mare dintre orice set). de numere). În exemplul nostru, intervalul este de la 1 la 100:

    Fie lowBound = 1; lasă highBound = 100; fie numInput = 123; let clamped = Math.max(lowBound, Math.min(numInput, highBound)); console.log(blocat); > 100;
    Din nou, putem reutiliza operația și înfășura totul într-o funcție, folosind soluția propusă de Daniel X. Moore:

    Number.prototype.clamp = function(min, max) ( return Math.min(Math.max(this, min), max); );
    Acum:

    NumInput.clamp(lowBound, highBound); > 100;

    Rotunjirea Gaussiană Rotunjirea Gaussiană, cunoscută și sub denumirea de rotunjire bancară, este locul în care rotunjirea pentru acest caz are loc la cel mai apropiat număr par. Această metodă de rotunjire funcționează fără erori statistice. O soluție mai bună a fost sugerată de Tim Down:

    Funcția gaussRound(num, decimalPlaces) ( fie d = decimalPlaces || 0, m = Math.pow(10, d), n = +(d ? num * m: num).toFixed(8), i = Math.floor (n), f = n - i, e = 1e-8, r = (f > 0,5 - e && f< 0.5 + e) ? ((i % 2 == 0) ? i: i + 1) : Math.round(n); return d ? r / m: r; }
    Acum:

    GaussRound(2,5) > 2 gaussRound(3,5) > 4 gaussRound(2,57,1) > 2,6
    Decimală în CSS:

    Deoarece JavaScript este adesea folosit pentru a crea mapări poziționale pentru elementele HTML, s-ar putea să vă întrebați ce s-ar întâmpla dacă am genera valori zecimale pentru elementele noastre:

    #box ( lățime: 63,667731993px; )
    Vestea bună este că browserele moderne vor respecta valorile zecimale în modelul bloc, inclusiv unitățile procentuale sau pixelii.

    Sortarea De foarte multe ori trebuie să sortăm unele elemente, de exemplu, avem o serie de înregistrări de joc și acestea trebuie organizate în ordinea descrescătoare a rangului jucătorului. Din păcate, metoda standard sort() are câteva limitări surprinzătoare: funcționează bine cu cuvintele englezești obișnuite, dar se defectează imediat când întâlnește numere, caractere unice sau cuvinte majuscule. Sortarea alfabetică S-ar părea că sortarea alfabetică a unei matrice ar trebui să fie o sarcină simplă:

    Lăsați fructe = [„dovleac”, „caise”, „gustalupe”]; fruct.sort(); > „caisă”, „dovleac”, „gustalup”]
    Cu toate acestea, ne confruntăm cu o problemă de îndată ce unul dintre elemente este cu majuscule:

    Lasa fructe = ["dovleac", "caise", "Cantalope"]; fruct.sort(); > „Cantalup”, „caise”, „dovleac”]
    Acest lucru se datorează faptului că, în mod implicit, sortatorul compară primul caracter reprezentat în Unicode. Unicode este un cod unic pentru orice caracter, indiferent de platformă, indiferent de program, indiferent de limbă. De exemplu, dacă te uiți la tabelul de coduri, caracterul „a” are valoarea U+0061 (în hexazecimal 0x61), în timp ce caracterul „C” are codul U+0043 (0x43), care vine mai devreme în Unicode tabel decât caracterul „a”.

    Pentru a sorta o matrice care poate conține primele litere mixte cu majuscule, trebuie fie să convertim temporar toate elementele în minuscule, fie să definim ordinea noastră de sortare folosind metoda localeCompare() cu unele argumente. De regulă, pentru un astfel de caz, este mai bine să creați imediat o funcție pentru utilizare repetată:

    Funcția alphaSort(arr) ( arr.sort(function (a, b) ( return a.localeCompare(b, "en", ("sensibilitate": "bază")); )); ) let fruit = ["dovleac butternut „, „caisă”, „Cantalup”]; alphaSort(fructe) >
    Dacă doriți ca matricea să fie sortată în ordine alfabetică inversă, schimbați pur și simplu pozițiile lui a și b în funcție:

    Funcția alphaSort(arr) ( arr.sort(function (a, b) ( return b.localeCompare(a, "en", ("sensibilitate": "bază")); )); ) let fruit = ["dovleac butternut „, „caisă”, „Cantalup”]; alphaSort(fructe) > ["Cantalupe", "dovleac", "caise"]
    Aici este de remarcat faptul că localeCompare este folosit cu argumente, trebuie să ne amintim, de asemenea, că este suportat de IE11+, pentru versiunile mai vechi de IE, îl putem folosi fără argumente și cu litere mici:

    Funcția caseSort(arr) ( arr.sort(funcție (a, b) ( return a.toLowerCase().localeCompare(b.toLowerCase()); )); ) let fruit = ["dovleac", "caise", "Pepene galben"]; caseSort(fructe) > ["caise", "dovleac", "Cantalup"]

    Sortare numerică Toate acestea nu se aplică exemplului despre care am vorbit mai sus despre gama de înregistrări de joc. Cu unele matrice numerice, sortarea funcționează bine, dar la un moment dat rezultatul poate fi imprevizibil:

    Fie highScores = ; highScores.sort(); >
    Chestia este că metoda sort() realizează o comparație lexicografică: ceea ce înseamnă că numerele vor fi convertite într-un șir și comparațiile se vor face din nou prin potrivirea primului caracter al acelui șir în ordinea caracterelor din tabelul Unicode. . Prin urmare, trebuie să definim din nou ordinea noastră de sortare:

    Fie highScores = ; highScores.sort(funcție(a,b) ( returnează a - b; )); >
    Din nou, pentru a sorta numerele în ordine inversă, schimbați pozițiile lui a și b în funcție.

    Sortarea unei structuri asemănătoare JSON În sfârșit, dacă avem o structură de date asemănătoare JSON reprezentată ca o matrice de înregistrări de joc:

    Fiți scoruri = [ ( „nume”: „Daniel”, „scor”: 21768 ), ( „nume”: „Michael”, „scor”: 33579 ), ( „nume”: „Alison”, „scor”: 38395 ) ];
    În ES6+, puteți utiliza funcții de săgeți:

    Scores.sort((a, b) => b.score - a.score));
    Pentru browserele mai vechi care nu au acest suport:

    Scores.sort(funcție(a, b) ( returnează a.score - b.score ));
    După cum puteți vedea, sortarea în JavaScript este un lucru destul de obscur, sper că aceste exemple vor face cumva viața mai ușoară.

    Lucrul cu funcții de putere Exponentiația este o operație definită inițial ca rezultat al înmulțirii repetate a unui număr natural cu el însuși. Am putea folosi aceste funcții în mod constant în viața de zi cu zi la lecțiile de matematică, inclusiv atunci când calculăm suprafețe, volume sau chiar în modelarea fizică.

    În JavaScript, funcția de putere este reprezentată ca Math.pow(), iar în noul standard ES7, a fost introdus un nou operator de exponențiere - " * * ".

    Ridicarea la o putere Pentru a ridica un număr la a n-a putere, utilizați funcția Math.pow(), unde primul argument este numărul care va fi ridicat la putere, al doilea argument este exponentul:

    Math.pow(3,2) > 9
    Această formă de notație înseamnă 3 pătrat, sau 3 × 3, ceea ce duce la rezultatul 9. Un alt exemplu poate fi dat, desigur:

    Math.pow(5,3); > 125
    Adică, 5 cuburi, sau 5 × 5 × 5, este egal cu 125.

    ECMAScript 7 este următoarea versiune de JavaScript, în principiu, putem folosi noul operator de exponențiere propus - * *, această formă de notație poate fi mai descriptivă:

    3 ** 2 > 9
    În momentul de față, suportul pentru acest operator este destul de limitat, așa că nu este recomandat să-l folosești.

    Funcția de putere poate fi utilă într-o varietate de situații. Un exemplu simplu, calcularea numărului de secunde într-o oră: Math.pow (60,2).

    Rădăcina pătrată și cubă Math.sqrt() și Math.cbrt() sunt opusul Math.pow(). După cum ne amintim, rădăcina pătrată a lui a este numărul care dă a când este pătrat.

    Math.sqrt(9) > 3
    În același timp, rădăcina cubă a lui a este un număr care dă a atunci când este ridicat la un cub.

    Math.cbrt(125) > 5
    Math.cbrt() a fost introdus doar recent în specificația JavaScript și, prin urmare, este acceptat doar în browserele moderne: Chrome 38+, Firefox și Opera 25+ și Safari 7.1+. Veți observa că Internet Explorer nu este în această listă, dar veți găsi o completare polivalentă pe MDN.

    Exemple Desigur, putem folosi valori non-întregi în una dintre aceste funcții:

    Math.pow(1,25, 2); > 1,5625 Math.cbrt(56,57) > 3,8387991760286138
    Vă rugăm să rețineți că acest lucru funcționează destul de bine și atunci când utilizați valori negative ale argumentelor:

    Math.pow(-5,2) > 25 Math.pow(10,-2) > 0,01
    Cu toate acestea, acest lucru nu va funcționa pentru rădăcina pătrată:

    Math.sqrt(-9) > NaN
    Din analiza matematică știm că un număr imaginar se referă la rădăcinile pătrate ale numerelor negative. Și asta ne poate conduce la o altă tehnică de lucru cu numere complexe, dar asta este o altă poveste.

    Puteți folosi fracții în Math.pow() pentru a găsi rădăcinile pătrate și cubice ale numerelor. Rădăcina pătrată folosește un exponent de 0,5:

    Math.pow(5, 0,5); // = Math.sqrt(5) = 5 ** (1/2) > 2,23606797749979
    Cu toate acestea, din cauza capricilor virgulă mobilă, nu puteți ghici exact rezultatul corect:

    Math.pow(2,23606797749979,2) > 5,000000000000001
    În astfel de situații, va trebui să recurgeți la tăierea semnelor din număr sau rotunjirea la o anumită valoare.

    Unii oameni, din motive necunoscute, în JavaScript confundă funcția Math.pow() cu Math.exp() , care este funcția exponențială pentru numere în general. Notă: în engleză, „exponent” este tradus ca „exponent”, deci este mai probabil să se aplice vorbitorilor de engleză, deși există denumiri alternative pentru exponent, cum ar fi index, putere.

    Constante matematice Lucrul cu matematica în JavaScript este facilitat de un număr de constante încorporate. Aceste constante sunt proprietăți ale obiectului Math. Este de remarcat faptul că constantele sunt scrise cu majuscule, nu cu notația CamelCase.

    Numai utilizatorii înregistrați pot participa la sondaj. , Vă rog.

    Etichete: Adăugați etichete Descriere

    Metoda Math.random() returnează pseudo Număr aleatoriu intre 0 si 1.

    Număr pseudorandom este creat în intervalul de la 0 (inclusiv) la 1 (exclusiv), adică numărul returnat poate fi zero, dar va fi întotdeauna mai mic de unu.

    Pentru a rotunji un număr cu virgulă mobilă la un număr întreg, puteți utiliza, de exemplu, metoda Math.floor().

    Sintaxă Math.random() Valoare returnată
    • Un număr în virgulă mobilă care variază de la 0 (inclusiv) la 1 (exclusiv).

    Metoda Math.random() este folosită în principal pentru a genera un număr pseudo-aleatoriu în anumit interval. De exemplu, trebuie să obținem un număr în intervalul de la 50 la 100 (inclusiv). Pentru a face acest lucru va trebui să scriem următorul cod:

    Document.write(Math.floor(Math.random() * 51 + 50));

    Să aruncăm o privire mai atentă la modul în care funcționează exemplul nostru și de ce este utilizată această formă de înregistrare. În primul rând, trebuie să indicăm valoarea minimă obținută din intervalul dorit, în exemplul nostru acesta este numărul 50. Acum trebuie să obținem cumva un număr aleatoriu, care, atunci când este adăugat cu numărul 50, nu va depăși totalul numărul 100. După cum știm din matematică, găsirea termenului necunoscut se face prin scăderea termenului cunoscut din sumă. 100 - 50: obținem diferența de 50. Acum, pentru a verifica dacă acest număr ni se potrivește sau nu, îl înmulțim cu numărul minim și maxim posibil returnat de metoda Math.random(). Înmulțim minimul 0.004704564176082244 * 50 = 0.2... și maximul 0.999999999746223 * 50 = 49.9... Și astfel vedem că atunci când înmulțim diferența cu numărul maxim posibil posibil, rezultatul ne dă o parte dintr-un număr într-un număr. mai puțin decât este necesar. Pentru a corecta situația, trebuie doar să adăugăm o unitate la 50, adică. 50 + 1 = 51, acum dacă numărul rezultat este înmulțit cu numărul maxim posibil returnat de metodă, vom obține numărul 50,9... - asta ne trebuie, după ce adunăm numerele 50,9 + 50, obținem 100,9 . Pentru a rotunji un număr la un întreg, utilizați metoda Math.floor(). Astfel, formula pentru obținerea numărului necesar este următoarea: max - min + 1. Să rescriem exemplul de mai sus:

    Var max = 100, min = 50; document.write(Math.floor(Math.random() * (max - min + 1) + min));

    Această formulă este utilă în special atunci când nu se știe în prealabil în ce interval trebuie obținut numărul aleator.

    Exemplu de titlu de document

    Număr pseudo-aleatoriu în intervalul de la 1 la 10.

    var x; pentru(var i = 0; i< 10; i++) { x = document.getElementById("test"); x.innerHTML += Math.floor(Math.random() * 10 + 1) + "
    "; ) 2 iunie 2013 la 22:56 Controlat prin aleatoriuîn JavaScript
    • JavaScript

    Un „algoritm” pentru selectarea aleatorie a valorilor dintr-o matrice fără a le repeta. Mai precis, ca parte a pregătirii mele JS, l-am folosit pentru a genera un grup RPG clasic de personaje (barbar, mag, hoț, cavaler, preot), fără a repeta clase și nume.

    Principiul este extrem de simplu, dar poate fi util pentru începătorii JS ca mine. Conexiunea cu RPG este pur simbolică - acum încerc activ să-mi schimb profilul de la marketing la IT (mi-am dat seama că sufletul meu minte) și să exersez forma de joc mult mai interesant.

    1. Creați un șablon Înainte de a genera un grup de personaje, trebuie să setați un șablon pentru generarea acestora. De fapt, aici este:

    Funcția GamePlayer(n, r, l, p) ( this.nick = n; this.role = r; this.level = l; this.portrait = p; )
    De fapt, această funcție va crea caractere din variabilele prin care va fi apelată. De exemplu:

    Var player1 = gameplayer nou ("Power Ranger","barbarian","64","img/barbarian.jpg")
    Acum variabila player1 stochează un barbar Power Ranger de nivel 64 cu un portret specific; putem afișa oricare dintre parametrii săi în corpul paginii folosind player1.nick, player1.level etc.

    Valorile (n, r, l, p) din GamePlayer sunt responsabile pentru primirea și ordinea în care datele sunt primite în funcție. Dacă în exemplu schimbăm n și r, atunci puternicul ranger Barbarian va rămâne în player1, ceea ce nu corespunde în totalitate sarcinii.

    2. Definiți matrice Pentru a nu crea noi înșine caractere, ci pentru a le genera aproape aleatoriu (cum este promis în titlu), avem nevoie de matrice din care să luăm parametrii acelorași caractere. După cum s-a descris deja mai sus, avem doar 4 parametri: numele personajului, clasă, nivel și portret.

    Matrice pentru nume:

    Var playerNames = ["Rabbit Helpless", "Warm Dreaded Foal", "Desire Kit", "Angel Dusty", "Sweety Frozen", "Silver Heavy Wombat", "Lost Puma", "Vital Panda", "Rolling Sun" , „Steel Runny”, „Young Fox”, „Needless Ruthless Volunteer”, „Chipmunk Cult”, „Indigo Puppy”];
    Ar fi posibil să mergem mai departe și să generăm nume din 2-3 componente, dar algoritmul pentru o astfel de îmbunătățire nu conține nimic nou (aceeași aleatorie), și atunci s-ar complica pur și simplu proces educațional.

    Matrice pentru clasă:

    Var playerRoles = ["barbar", "mag", "necinsti", "cavaler", "preot"];
    Totul este la fel de evident. Mai multe șiruri, din care vom selecta apoi valori de afișat pe pagină.

    Matrice pentru nivel:

    ÎN exemplu concret, am vrut ca toți membrii partidului să fie între nivelul 60 și 70. Dar, deoarece condițiile se pot schimba, a fost necesar să se creeze o matrice de la nivelul 0 la 80, din care apoi să selecteze valorile necesare. Creat într-o buclă:

    Var playerLevels = ; pentru (i = 0;i