JavaScript zaokruži do 2 znaka. Metode Zaokruživanje brojeva u JavaScript-u

Zdravo, ljubitelji javascript-a. Već ste primijetili da je ovaj jezik vrlo izvanredan, a u svakom se dijelu ističe za svoje osobitosti i neobična tehnička rješenja. Stoga je današnja publikacija posvećena temi: JavaScript zaokruživanje.

Nakon čitanja trenutnog članka, saznat ćete zašto je potrebno zaokružiti brojeve, koje metode i svojstva u JS-u obavljaju ovu funkciju, kao i podjelu 0. Bez promjene vaših principa, pripisujem se na ključne točke materijal i napisati svaku akciju detaljno. Sada počnemo učiti!

Važne napomene o brojevima

Za početak, zapamtite da se u JS-u sve vrste brojeva (frakcijski i cijeli broj) odnose na tip Broj. Pored toga, svi su 64-bitni, jer su pohranjeni u formatu "dvostruko precizni", koji je takođe poznat i pod IEEE-754 standardom.

Stvorene numeričke varijable sa uobičajenim načinom:

var otrmb \u003d 35; // prirodni broj

var Drob \u003d 0,93; // decimalni prikaz

var numb16 \u003d 0xff; // 16-rifhery sistem

Podržava druge numeričke poglede. Dakle, možete stvoriti i brojeve s plutajućom tačkom (ponekad se nazivaju "brojevi u naučnom formatu").

U pojavilo je podršci za vrlo zanimljivu metodu tolocalestring ()koji formatira sve numeričke parametre prema specifikacijama propisanim ECMA 402. Zbog ovog velikog broja, brojeva telefona, valuta, pa čak i postotaka lijepo se prikazuju u dijaloškom okviru.

var num \u003d 714000,80;

upozorenje (num.tolocalestring ());

Raditi sa elementima tipa broja, cijeli globalni objekt s gomilom svih vrsta matematičkih funkcija, čijeg imena Matematika..

Pored toga, postoje i druge metode koje vrše zaokruživanje numeričkih vrijednosti cijelim brojevima, do desetina, stotih, itd. Smatrajte ih sve više.

Sjajna i moćna matematika

Globalni matematički objekt uključuje ogroman broj različitih matematičkih i trigonometrijskih funkcija. Ovo je vrlo potreban objekt i često seče programera prilikom rada sa digitalnim podacima.

Na ostalim platformama, postoje analogije matematike. Na primjer, na popularnim jezicima kao što su Java i C #, matematika je klasa koja podržava sve iste standardne funkcije. Dakle, kao što vidite ovaj alat je zaista sjajan i moćan.

Sada želim proći kroz specifične metode odgovorne za zaokruživanje i detaljno govoriti o njima.

Math.floor ()

Počeću S. Matematika.pod. Obratite pažnju na naziv metode. Logično to postaje jasno da otkad govorimo o zaokruživanju, a doslovni prijevod riječi "pod" znači "pod", tada ovaj alat zaokružuje prerađene vrijednosti u manjem.

Moguća je i opcija kada prerađeni broj pomoću ove funkcije ostaje isti. Sve jer se zaokruživanje vrši na ne-neuronskoj nejednakosti (<=). Таким образом, при отработке этой строчки кода:

upozorenje (math.floor (4.5));

odgovor će biti broj 4.

Math.ceil ()

Opet pogledajte ime (u takvoj metodi, materijal se brzo apsorbuje). Ako neko ne zna, "CEIL" znači "plafon". To znači da će se zaokruživanje numeričkih podataka biti izvedeno na najviše strane, koristeći ne-nejednakost (\u003e \u003d).

upozorenje (math.ceil (4.5));

Kao što ste već pretpostavljali, odgovor će biti broj 5.

Math.round ()

Ova metoda okružuje frakcionalni broj u najbližu cjelinu. Dakle, ako je frakcijski dio u rasponu od 0, a do 0.5 Nije uključeno, zaokruživanje se događa na manju vrijednost. A ako je frakcijski dio u rasponu od inkluzivnog 0,5 i do sljedećeg cijelog cijelog, zaokružen je u veću cjelinu.

upozorenje (math.round (4.5));

Nadam se da su svi pomislili ili su rekli tačan odgovor - 5.

Još neke metode

JavaScript također ima i ostale dvije metode koje se bave zaokruživanjem numeričkim prikazima. Međutim, oni su pomalo drugačiji.

Bit će riječ o takvim instrumentima kao tofixed () i ispred (). Oni ne odgovaraju ne samo za zaokruživanje, već zbog preciznosti određenih znakova. Hajde da se borimo dublje.

tofixed ()

Ovim mehanizmom možete odrediti, koliko znakova nakon zareza trebaju zaokružiti vrijednost. Metoda vraća rezultat kao niz. Ispod sam priložio opciju sa tri različite opcije. Analizirajte primljene odgovore.

var num \u003d 5656.9393;

dokument.writeln (num.tofixed ()); // 5657.

dokument.writeln (broj.tofikseljen (2)); // 5656,94

dokument.writeln (num.tofixed (7)); // 5656.9393000

Kao što se može vidjeti, ako ne navedete argument, tada se tofiksira ()) ruši frakcionalna vrijednost u cjelinu Brojevi. U trećem retku je završio zaokruživanje do 2 znakaa u četvrtom - zbog parametra "7", adresirana su još tri 0.

ispred ()

Ova metoda djeluje donekle različito. Na mjestu argumenta, možete ostaviti i prazno mjesto i postaviti parametar. Međutim, potonji će zaokružiti brojeve prije navedenog broja brojeva, ne obraćajući pažnju na zarez. Evo rezultata programa koji su prepisani iz prošlosti primjera:

var num \u003d 5656.9393;

dokument.writeln (broj.toprecizija ()); // 5656.9393

dokument.writeln (broj.toprecizija (2)); // 5.7e + 3

dokument.writeln (broj.toprecizija (7)); // 5656.939

Datoteka divizije na 0 u JS-u

Kao što je poznato iz lekcija iz matematike, nemoguće je podijeliti na nulu. Ovo je pravilo poduzelo kao osnova većina kreatora programskih jezika. Stoga, pri dijeljenjem na nulu, svi programi daju grešku.

Međutim, JavaScript se razlikovao ovdje. Dakle, za vrijeme izvršenja takve operacije ne pojavljuju se poruke o grešci ... jer se takav operacija vraća "Beskonačnost"!

Zašto tako? Kao što je poznato iz iste matematičke nauke, manji razdjelnik, rezultat je veći broj. Zbog toga su kreatori ovog jezika orijentiranog na prototip odlučili napustiti predloške i ići svoj put.

Za one koji su se prvi suočeni s vrijednosti beskonačnosti, ispod objasnio sam njegove karakteristike.

Infinity - znači beskonačnost i u potpunosti se podudara sa matematičkim znakom ∞.

Može biti negativan. Spremljene su i sva standardna pravila za rad sa aritmetičkim operaterima.

upozorenje (12/0); // beskonačnost

upozorenje (12.34 / 0); // beskonačnost

upozorenje (-3 / 0); // -Init.

Na ovo, možda i završiti. Ako vam se sviđa publikacija, onda se obavezno pretplatite na moj blog. Ne činite se referenca na zanimljive članke i dijelite ih sa prijateljima. Ćao ćao!



JavaScript-matematika, zaokruživanje do dva decimalna mjesta (9)

Imam sljedeću javaScript sintaksu:

Var popust \u003d math.round (100 - (cijena / popisPrice) * 100);

Ovo je zaokruženo na cijeli broj. Kako mogu vratiti rezultat sa dva decimalna znaka?

Evo primera za rad

Var vrijednost \u003d 200.2365455; Rezultat \u003d math.round (vrijednost * 100) / 100 // Rezultat će biti 200,24

Za obradu zaokruživanja bilo kojeg broja decimalnih mjesta za većinu potreba, bit će dovoljno funkcije sa 2 kodne linije. Evo primjera za igru \u200b\u200bprimjera.

Var testnum \u003d 134.9567654; Var decpl \u003d 2; var testres \u003d krugdec (testnum, decpl); Upozorenje (testnum + "zaokruženo na" + decembar + "decimalna mjesta su" + testre); Funkcionalni krug (NBR, dec_places) (var mult \u003d math.pow (10, dec_places); povratak matematike.round (NBR * mult) / mult;

Najbolje i jednostavno rješenje koje sam pronašao je

Funkcijska runda (povratni broj (math.round (vrijednost + e "+ decimal) +" E - "+ decimal);) krug (1.005, 2); // 1,01

Mala varijacija prihvaćenog odgovora. TOFIXED (2) Vraća niz, a uvijek ćete dobiti dva decimalna znaka. To može biti nulos. Ako želite suzbiti konačnu nulu, samo uradite to:

Var popust \u003d + ((cijena / popisPrice) .tofikseljeni (2));

Uređeno: Upravo sam otkrio da izgleda greška u Firefoxu 35.0.1, što znači da gore navedeno može dati nane neke vrijednosti.
Promijenio sam svoj kod

Var popust \u003d math.round (Cijena / ListaPrice * 100) / 100;

To daje broj s tačnošću dva decimalna mjesta. Ako vam trebaju tri, pomnožite se i podijelite 1000 i tako dalje.
OP želi uvijek dva decimalna pražnjenje uvijek, ali ako je u Firefoxu polomljen () u Firefoxu, prvo ga morate popraviti.
Pogledajte https://bugzilla.mozilla.org/show_bug.cgi?id\u003d1134388.

Da biste postigli rezultat sa dva decimalna znaka, možete učiniti sljedeće:

Var popust \u003d math.round ((100 - (cijena / popisPri) * 100) * 100) / 100;

Vrijednost koja je potrebno zaokružiti množi se sa 100 da bi se uštedjeli prve dvije znamenke, a zatim podijelimo na 100 da bismo dobili stvarni rezultat.

Mislim da je najbolji način koji sam vidio umnožavan za 10 po broju brojeva, a zatim napravite matematiku.round, a zatim konačno podijelite 10 po broju brojeva. Evo jednostavne funkcije koju koristim u pisanim tekstovima:

Funkcionalna kruga (vrijednost: broj, cifre: broj) (vrijednost \u003d vrijednost * math.pow (10, znamenke); vrijednost \u003d math.round (vrijednost); vrijednost / mathent.pom (10, cifre); povratna vrijednost; )

Ili jednostavan JavaScript:

Funkcionalni krugstoksipisi (vrijednost, cifre) (ako (! Cifre) (cifre \u003d 2;) vrijednost \u003d vrijednost * math.pow (10, cifre); vrijednost \u003d math.round (vrijednost); vrijednost / mather.pow (10 , cifre); povratna vrijednost;)

BILJEŠKA. - Pogledajte Uredi 4 ako je važna trocifrena tačnost.

Var popust \u003d (cijena / popisPrice) .Tofikseljeni (2);

tofixed je zaokružen ili dolje za vas ovisno o vrijednostima koje prelaze 2 decimalne znakove.

Promjena. Kao što spominju drugi, pretvara rezultat u nizu. Da biste izbjegli ovo:

Var popust \u003d + ((cijena / popisPrice) .tofikseljeni (2));

Uređivanje 2. - Kao što je spomenuto u komentarima, ova funkcija se ne izvodi s nekom tačnošću, na primjer, u slučaju 1.005, vratit će se 1,00 umjesto 1,01. Ako je tačnost važna za takav mjeri, našao sam ovaj odgovor: https: //.com/a/32605063/1726511 Šta izgleda dobro sa svim testovima koje sam pokušao.

Jedna mala modifikacija zahtijeva, ali odgovor gore navedeno vraća cijele brojeve kada se zaokružuje na jedan, na primjer, 99.004 će se vratiti 99 umjesto 99,00, što nije savršeno za prikaz cijena.

Uredi 3. - Čini se da je tofiksirano na stvarnom povratku još uvijek uvijene nekih brojeva, čini se da je konačno uređivanje radi. Geez toliko reparacija!

Var popust \u003d krugto ((Cijena / ListaPrice), 2); Funkcijski krug (n, cifre) (ako (cifre \u003d\u003d\u003d nedefinirano) (cifre \u003d 0;) var multiplikator \u003d math.pow (10, cifre); n \u003d parsefloator ((n * multiplikator) .Tofiksirani (11)); var test \u003d (math.round (n) / multiplikator); povratak + (test.tofixed (cifre));)

Uredi 4. "Vi me ubijete." Uređivanje 3 ne uspijeva na negativnim brojevima, bez kopanja zašto je lakše jednostavno napraviti negativan broj pozitivan prije zaokruživanja, a zatim je vratite prije povratka.

Funkcijski krug (n, cifre) (var negativan \u003d false; ako (cifre \u003d\u003d\u003d nedefinirano) (cifre \u003d 0;) ako (n)< 0) { negative = true; n = n * -1; } var multiplicator = Math.pow(10, digits); n = parseFloat((n * multiplicator).toFixed(11)); n = (Math.round(n) / multiplicator).toFixed(2); if(negative) { n = (n * -1).toFixed(2); } return n; }

Najbrži način - brže od tofixed ():

Dva dekalila

x \u003d .123456 rezultat \u003d math.round (x * 100) / 100 // Rezultat .12

Tri decimale

x \u003d .123456 rezultat \u003d math.round (x * 1000) / 1000 // Rezultat .123

Funkcionalna runda (broj, dec) (broj \u003d math.round (Num + E "+ DEC) povratni broj (Num +" E - "+ dec)) // Okrugli do decimalnog broja odabira: okruglo (1.3453.2)

Zdravo. Danas ćemo u JavaScript stupcu pogledati kako postaviti na JavaScript broj sezona u broju plutajućih točaka. Na primjer, trebate ostaviti 3 decimalni znak prilikom prikazivanja ili samo dva.

Zadatak: JavaScript broj zareznih zareza

Dakle, suočeni smo s zadatkom: postoji rezultat izračuna, u kojima postoje brojevi prije zareza i nakon zareza. Decimalni. Pretpostavimo da je rezultat pokazao ovo 1538.9891200153. Ali kada bi izlaz trebao biti broj koji odražava iznos, gdje je iznos novčanica do zareza, a nakon - Kopecks.

Postoji nekoliko načina za rješavanje ovog zadatka.

Rješenje 1: JavaScript broj zarez s tafiksedom metodom

tOFIXED je ugrađeni u JavaScript metodu koja se primjenjuje na bilo koji broj, tačnost uzima tačnost zaokruživanja (to jest broj znakova uz morsko obale).

Var num \u003d 1538.9891200153; num_str \u003d num.tofixed (); // num_str \u003d 1538; num_str \u003d num.tofixed (2); //Num_str\u003d1538.98; num_str \u003d num.tofixed (5); //Num_str\u003d1538.98912;

Parametar tačnosti u ovoj funkciji trebao bi biti najmanje 0 (ne uzima negativne vrijednosti), a ne više od 20.

Možete i bez varijable, na primjer, ovako:

Num_str \u003d (1538.9891200153) .tofikseljen (2); //Num_str\u003d1538.98;

Rješenje 2: JavaScript broj zarez s metodom Topresision

Ovo rješenje temelji se na istom ugrađenom JavaScript metodi. Izrazita karakteristika ove metode je da parametar preuzet na ulaz označava ne tačnost (broj zareza), ali ukupnog broja znakova (i na zarez i nakon njega).

Var num \u003d 1538.9891200153; num_str \u003d num.toprecizija (5); //Num_str\u003d1538.9; num_str \u003d num.toprecizija (7); //Num_str\u003d1538.989;

Rješenje bez znakova nakon zareza: JavaScript broj zareznih zareza

Ako decimalni znakovi trebaju biti potpuno preklopljeni, odnosno potrebno je zaokružiti frakcijski broj u cjelinu, a zatim možete koristiti funkcije matematike: okrugli, plahte i pod.
Okrugli - rundi na veliku ili manju stranu (ovisno o broju). Ako je vrijednost nakon zareza više od polovine, a zatim zaokružite na cijelu stranu, ako je manje - na manje. To je, ako 0,51 - bit će 1, ako 0,49 - 0.

CEIL - sa engleskog jezika. Strop se uvijek zaokružuje na najveću stranu.

Pod - sa engleskog. Paul runde uvijek na manjoj strani.

Var num \u003d 1538.9891200153; num_str \u003d math.round (broj); // num_str \u003d 1539; num_str \u003d math.floor (broj); // num_str \u003d 1538; num_str \u003d math.ceil (broj); // Num_str \u003d 1539;

To je sve. Nadam se da je ova beleška pomogla da riješite zadatak. Ako nešto nije uspjelo - postavite pitanja pomoću zelenog gumba "Postavite pitanje stručnjakom", ili u komentarima.

Često izračuni daju rezultate koji ne odgovaraju granicama željenih raspona. Kao rezultat toga, morate vježbati JavaScript zaokruživanje do određene vrijednosti.

Zašto okrugli brojevi?

JavaScript ne čuva cijene brojeve, jer su njihove vrijednosti prikazane u obliku plutajućih brojeva. Mnoge frakcije ne mogu predstavljati broj s određenim konačnim brojem zareza, pa JavaScript može generirati rezultate, poput sljedećeg:

0.1 * 0.2; > 0.020000000000000004

U praksi neće imati značaj, jer je u pitanju greška u 2 Quinylonne. Ali to može utjecati na rezultat prilikom rada s brojevima koji predstavljaju vrijednosti ventila, postotak ili veličinu datoteke. Stoga morate učiniti ili do određenog decimalnog znaka.

Zaokruživanje decimalnih brojeva

Za "obrezivanje" decimalni broj, koriste se metode za tofikserene () ili preciznost (). Oboje uzimaju jedan argument koji određuje broj značajnih i oznaka nakon zareza, koji mora biti uključen u rezultat:

  • ako za Tofixed () Argument nije definiran, zadana vrijednost je 0, odnosno nema znakova nakon zareza; Maksimalna vrijednost argumenta je 20;
  • ako za izradu () argument nije naveden, broj se ne mijenja.

var Randnum \u003d 6.25; randnum.tofixed (); \u003e "6" math.pi.topresision (1); \u003e "3" var randnum \u003d 87.335; Randnum.tofixed (2); \u003e "87,33" VAR RAndnum \u003d 87.337; Randnum.topresision (3); \u003e "87.3"

Bilješka

I tofiksed (), a naplaciranje vraćaju zaobljenu reprezentaciju umanjenog sloja, a ne broj. To znači da će dodavanje obručenog na Randnum rezultirati koncentinskim nizom, a ne jedan broj:

konzola.log (Randnum + zaobljeni); \u003e "6.256"

Ako trebate dobiti JavaScript zaokruživanje na stotine, koristite ParseFloat ():

var Randnum \u003d 6.25; var zaobljeni \u003d parsefflopt (Randnum.Tofixed (1)); Konzola.log (zaobljena); \u003e 6.3.

tOFIXED () I PRIZESTANJE () su takođe korisne metode za skraćivanje velikog broja zareza. Prikladno je za rad sa brojevima koji predstavljaju novčane jedinice:

var wholenum \u003d 1 var dolarcents \u003d wholenum.tofiksed (2); Konzola.log (dolaricenti); \u003e "1,00"

Imajte na umu da ako postoji više znakova od navedenog parametara tačnosti, preciznost će izdati rezultat u naučnom formatu:

var num \u003d 123.435 num.toprecision (2); \u003e "1.2E + 2"

Kako izbjeći greške prilikom zaokruživanja decimalnih frakcija

U nekim slučajevima se provodi tafiksed i prenošenje JavaScript zaokruživanje 5 na manju stranu, ne do više:

var Numtest \u003d 1.005; numtest.tofixed (2); \u003e 1;

Rezultat gore navedenog primjera trebao bi biti 1,01, a ne 1. Ako želite izbjeći ovu grešku, preporučujem korištenje eksponencijalnih brojeva:

funkcijska runda (povratni broj (math.round (vrijednost + e "+ decimal) +" E - "+ decimal);)

Primjena:

runda (1.005.2); \u003e 1,01

Ako vam je potrebno još pouzdanije rješenje od zaokruživanja, dostupan je na MDN..

Zaokruživanje epsilonom

Alternativna metoda JavaScript zaokružio do desetina uveden je u ES6 ( poznat i kao JavaScript 2015). « Mašina Epsilon»Pruža razumnu granicu greške prilikom uspoređivanja dva plutajuća zarez. Bez zaokruživanja, usporedbe mogu dati rezultate kao što slijedi:

0,1 + 0,2 \u003d\u003d\u003d 0,3\u003e FALSE

Math.epsilon se može koristiti u funkciji da bi se dobila ispravna usporedba:

funkcija ECseex (x, y) (povratak matematike (x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }

Funkcija poduzima dva argumenta: Jedan sadrži proračune, drugi očekivani (zaobljeni) rezultat. Vraća usporedbu ova dva parametara:

eCse (0,1 + 0,2, 0,3)\u003e TRUE

Svi moderni pretraživači podržavaju ES6 matematičke funkcije. Ali ako trebate pružiti podršku u starim preglednicima, morate koristiti polifilla.

Organizacija decimalnih brojeva

Sve metode predstavljene ranije izvode JavaScript zaokružio do desetina. Da biste obrežili pozitivan broj do dva mjesta nakon zareza, pomnožite ga na 100, ponovo, a zatim je dobijeni rezultat podijeljen sa 100, potrebni su vam:

funkcija skraćena (broj) (povratak math.trunc (broj * 100) / 100;) skraćen (3.1416)\u003e 3.14

Ako je potrebno nešto fleksibilnije, možete koristiti slomljeni operater:

funkcija skraćena (var numpowerconverter \u003d math.pow (10, decimalnaplava); povratak ~~ (broj * numpowerconverter) / numpowerconverter;)

Korištenjem:

var randint \u003d 35.874993; Skraćeni (Randont, 3); \u003e 35.874.

Zaokruživanje na najbliži broj

Implementirati JavaScript zaokruži u cjelini, Math.round () se koristi:

Math.round (4.3)\u003e 4 math.round (4.5)\u003e 5

Zapiši to " polovine vrijednosti", Poput .5, zaokruženo.

Zaokruživanje do najbližeg cijelog broja

Ako želite zaokružiti na manju stranu, koristite metodu matematike ():

Math.floor (42.23); \u003e 42 Math.floor (36.93); \u003e 36.

Zaokruživanje "dolje" ima jedan smjer za sve brojeve, uključujući negativne. To se može predstavljati kao neboder sa beskonačnim brojem podova, uključujući ispod nivoa temelja ( predstavljajući negativne brojeve). Ako se nalazite u liftu između podrumskih podova 2 i 3 ( Što odgovara vrijednosti -2,5), Math.floor će vas dostaviti na pod -3:

Math.floor (-2.5); \u003e -3.

Ako želite to izbjeći, koristite JavaScript matematičku zaokruživanje pomoću mathent.trunc () podržanog u svim modernim preglednicima (osim Tj / ivica):

Math.trunc (-41.43); \u003e -41

MDN takođe pruža polifipa od tri retka za pružanje podrške matematicima u starim preglednicima i tj. / Ivicom.

Zaokruživanje do najbližeg cijelog broja

Ako želite zaokružiti decimalne brojeve, koristite math.ceil. Radnja ove metode može se zastupljena i kao beskrajni lift: math.ceil je uvijek sretan "gore", bez obzira na to je li broj negativan ili pozitivan:

Math.ceil (42.23); \u003e 43 math.ceil (36.93); \u003e 37 math.ceil (-36,93); -36

Zaokruživanje na najbliži višestruki broj

Ako trebate zaokružiti vrijednost na najbliži broj, višestruki 5, stvorite funkciju koja podijeli broj na 5, zaokruži ga, a zatim umnožava rezultat na istoj vrijednosti:

funkcijski krugO5 (broj) (povratni math.round (broj / 5) * 5;)

Korištenjem:

krug5 (11); \u003e 10.

Ako želite izvršiti JavaScript zaokruživanje do dva znaka, možete prenijeti funkcije kao početni broj i množenost:

funkcijski krugTomultiple (broj, više) (povratak matematike.Round (Num / više) * višestruki;)

Da biste koristili funkciju, uključite zaobljeni broj i višestruko u svom pozivu:

var initainnumber \u003d 11; var višestruko \u003d 10; KrugTomultiple (inicijalni broj, višestruki); \u003e 10;

Da biste zaokružili vrijednosti samo u velikom ili manjem smjeru, zamijenite u okrugli funkciju na plailu ili podu.

Vezing za raspon

Ponekad trebate dobiti vrijednost x koja bi trebala biti unutar određenog raspona. Na primjer, potrebna vam je vrijednost od 1 do 100, ali dobivamo vrijednost 123. Da biste ga popravili, možete koristiti min () ( vraća najmanje brojeva) i max ( vraća maksimalni dozvoljeni broj).

Korištenjem:

var lowbound \u003d 1; Var Highbound \u003d 100; Var Numinput \u003d 123; var stegnuta \u003d math.max (niska, matematika (Numinput, visoki)); Konzola.log (stegnuta); \u003e 100;

Možete kreirati funkciju ili broj razreda proširenja.

Vrlo često proračuni u JavaScript ne daju baš rezultate koje želimo. Naravno, sa brojevima možemo učiniti - zaokruživanje na veliku ili manju stranu, postavite se rasponi, prekinite nepotrebne brojeve na određeni broj decimalnih mjesta, sve ovisi o tome što želite učiniti u budućnosti s ovim brojem.

Zašto vam treba zaokruživanje?

Jedan od znatiželjnih aspekata JavaScripta je taj što zapravo ne čuva cijene brojeve, odmah radimo s plutajućim brojevima. To, u kombinaciji sa činjenicom da se mnoge frakcionalne vrijednosti ne mogu izraziti konačnim brojem decimalnih znakova, možemo dobiti takve rezultate u JavaScript-u:

0.1 * 0.2; > 0.020000000000000004 0.3 - 0.1 > 0.19999999999999998
U praktične svrhe, ova netačnost nije važna, u našem slučaju govorimo o grešci u Quintillion dolara, međutim, neko može razočarati. Možemo dobiti nešto čudan rezultat i pri radu sa brojevima koji su vrijednosti ventila, postotak ili veličina datoteka. Da bismo ispravili ove netočnosti, samo moramo biti u mogućnosti zaokružiti rezultate, dok je dovoljno za uspostavljanje decimalne tačnosti.

Zaokruživanje brojeva ima praktičnu primjenu, na primjer, možemo manipulirati brojem u određenom rasponu, na primjer, želimo zaokružiti vrijednost na najbliži cijeli broj, a ne raditi samo decimalnim dijelom.

Zaokruživanje decimalnih brojeva

Da biste prekinuli decimalni broj, koristite metodu TOFIX ili ToProsision. Oboje uzimaju jedan argument koji određuje, odnosno koliko smislenih brojeva (i.e., ukupan broj brojeva koji se koriste među brojem) ili nakon zarez (količina nakon decimalne tačke) treba sadržavati rezultat:
  1. Ako se argument nije definiran za tofiksed (), tada će po zadanim postavkama biti nula, što znači 0 ocjena nakon zareza, argument ima maksimalnu vrijednost jednaku 20.
  2. Ako argument nije naveden za primenu, broj ostaje netaknut
Neka Randnum \u003d 6.25; randnum.tofixed (); \u003e "6" math.pi.topresision (1); \u003e "3" Randnum \u003d 87.335; Randnum.tofixed (2); \u003e "87,33" Randnum \u003d 87.337; Randnum.topresision (3); \u003e "87.3"
I tifixed () i ToProcision () metode vraćaju niz rezultata, a ne broj. To znači da će se prilikom zbrajanja zaobljene vrijednosti s Randnumom napraviti redovi, a ne iznos brojeva:

Neka Randnum \u003d 6.25; Ostavite zaobljene \u003d randnum.tofixed (); // "6" konzola.log (Randnum + zaobljeni); \u003e "6.256"
Ako želite rezultat da imate numeričku vrstu podataka, morat ćete primijeniti ParseFloat:

Neka Randnum \u003d 6.25; Pustiti zaobljeni \u003d parseff (Randnum.Tofiksed (1)); Konzola.log (zaobljena); \u003e 6.3.
Imajte na umu da su 5 vrijednosti zaokružene, s izuzetkom rijetkih slučajeva.

Tofixed () i ToProcision () metode su korisne, jer ne mogu isključiti samo frakcijski dio, već i dopunjuju znakove nakon zareza, koji je prikladan za rad sa valutom:

Pustite da je to što je od 1 pustio doline \u003d wholenum.tofikseljen (2); Konzola.log (dolaricenti); \u003e "1,00"
Stanje napomene da će preciznost dati rezultat u eksponencijalnom zapisu ako je broj cijelih brojeva veći od samog preciznosti:

Neka broj \u003d 123.435 num.toprecision (2); \u003e "1.2E + 2"

Kako izbjeći zaokruživanje grešaka s decimalnim brojevima

U nekim slučajevima, tofiksirani i preciznost zaokružuju vrijednost 5 na manju stranu, a u velikom:

Neka je Numtest \u003d 1.005; numtest.tofixed (2); \u003e "1,00"
Rezultat gore navedenog proračuna bio je 1,01, a ne 1. Ako želite izbjeći sličnu grešku, možemo koristiti rješenje koje je predložio Jack l Moore, koji koristi eksponencijalne brojeve za izračunavanje:

Funkcijska runda (povratni broj (math.round (vrijednost + e "+ decimal) +" E - "+ decimal);)
Sad:

Runda (1.005.2); \u003e 1,01
Ako želite pouzdanije rješenje od gore prikazanog otopine, možete ići na MDN.

Mašina Epsilon zaokruživanje

Alternativna metoda zaokruživanja decimalnih brojeva uvedena je u ES6. Mašina Epsilon zaokruživanje pruža razumnu granicu greške prilikom uspoređivanja dvije brojeve plutajućih točaka. Bez zaokruživanja, usporedbe mogu dati rezultate kao što slijedi:

0,1 + 0,2 \u003d\u003d\u003d 0,3\u003e FALSE
Koristimo math.epsilon u našoj funkciji da bismo dobili ispravnu usporedbu:

Funkcija ECseex (x, y) (povratak matematike (x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
Funkcija poduzima dva argumenta: Prvi - trenutni izračun, drugi je očekivani rezultat. Vraća usporedbu dva:

ECse (0,1 + 0,2, 0,3)\u003e TRUE
Svi moderni preglednici već podržavaju matematičke funkcije ES6, ali ako želite dobiti podršku u pretraživačima kao što su IE 11, koristite polifila.

Rezanje frakcijskim dijelom

Sve predstavljene metode gore mogu se zaokružiti do decimalnih brojeva. Da biste jednostavno isključili broj do dva znaka nakon zareza, prvo ga morate pomnožiti za 100, a zatim je dobijen rezultat već podijeljen sa 100:

Funkcija skraćena (broj) (povratak math.trunc (broj * 100) / 100;) skraćen (3.1416)\u003e 3.14
Ako želite prilagoditi metodu za bilo koji broj zareza, možete koristiti dvostruku mantu negiranje:

Funkcija skraćena (neka numpowerconverter \u003d math.pow (10, decimalnoplave); povratak ~~ (numpowerconverter) / numpowerconverter;)
Sad:

Neka RandanTint \u003d 35.874993; Skraćeni (Randont, 3); \u003e 35.874.

Zaokruživanje na najbliži broj

Da biste zaokružili decimalni broj na najbliži broj u više ili na manjoj strani, ovisno o tome što smo najbliži, koristite math.round ():

Math.round (4.3)\u003e 4 math.round (4.5)\u003e 5
Imajte na umu da je "polovina vrijednosti", 0,5 zaokružena u velikom smjeru u skladu sa pravilima matematike.

Zaokruživanje manjem do najbliže cijeli broj

Ako želite uvijek zaokružiti na manjoj strani, koristite matematiku.Floor:

Math.floor (42.23); \u003e 42 Math.floor (36.93); \u003e 36.
Imajte na umu da zaokruživanje na manjim bočnim radovima za sve brojeve, uključujući negativne. Zamislite neboder s beskonačnim brojem podova, uključujući podove niskog nivoa (koji predstavljaju negativne brojeve). Ako se nalazite u liftu na donjem nivou između 2 i 3 (što je vrijednost -2,5), matematika će vam dostaviti na -3:

Math.floor (-2.5); \u003e -3.
Ali ako želite izbjeći sličnu situaciju, koristite math.trunc, podržane u svim modernim preglednicima (osim IE / EDGED):

Math.trunc (-41.43); \u003e -41
Polifipa ćete naći na MDN-u da biste pružili math.trunc podršku u pretraživačima i tj. / Ivici.

Zaokruživanje više na najbliži cijeli broj

S druge strane, ako uvijek trebate zaokružiti do najvećeg, koristite math.ceil. Opet se sjetite beskrajnog lifta: math.ceil će uvijek ići gore, bez obzira da li je broj negativan ili ne:

Math.ceil (42.23); \u003e 43 math.ceil (36.93); \u003e 37 math.ceil (-36,93); \u003e -36

Zaokruživanje na veći / manji broj

Ako želimo zaokružiti do najbližeg broja, više od 5, najlakši način za stvaranje funkcije koja podijeli broj na 5 zaokružuje, a zatim ga pomnoži na isti iznos:

Funkcijski krugO5 (broj) (povratni math.round (broj / 5) * 5;)
Sad:

Krug5 (11); \u003e 10.
Ako želite zaokružiti više od vaše vrijednosti, koristimo opću funkciju prenošenjem početne vrijednosti i višestrukog prema njemu:

Funkcijski krugTomultiple (broj, više) (povratak matematike.Round (Num / više) * višestruki;)
Sad:

Pustite inicijalnoj broj \u003d 11; Neka je više \u003d 10; KrugTomultiple (inicijalni broj, višestruki); \u003e 10;

Pričvršćivanje broja u rasponu

Postoji mnogo slučajeva kada želimo dobiti vrijednost x leži u rasponu. Na primjer, možda će nam trebati vrijednost od 1 do 100, ali istovremeno smo dobili vrijednost od 123. Da bismo ga popravili, možemo koristiti minimum (vraća najmanje broja brojeva) i maksimum ( Vraća najveći od bilo kakvih više brojeva). U našem primjeru raspon od 1 do 100:

Pusti lowbound \u003d 1; Pustiti visoko \u003d 100; Pustite brojnom \u003d 123; Pustite da stegnute \u003d math.max (niska, matematika.min (numerizacija, visoki)); Konzola.log (stegnuta); \u003e 100;
Opet, možemo ponovo koristiti operaciju i zamotati sve u funkciju, koristimo rješenje koje je predložio Daniel X. Moore:

Broj.prototip.clamp \u003d Funkcija (min, max) (povratak math.min (math.max (ovo, min), max););
Sad:

Numinput.Clamp (slabo, visoki); \u003e 100;

Gaussove zaokruživanje

Gaussove zaokruživanje, poznato i kao bankovna zaokruživanja, je da se zaokruživanje za ovaj slučaj događa do najbliže crne. Ova metoda zaokruživanja radi bez statističke greške. Najbolje rješenje predložilo je Tim Down:

Funkcija Gaussound (Let D \u003d Decimalplaces || 0, m \u003d math.pow (10, d), n \u003d + (d? Broj * m: num) .tofikseljen (8), i \u003d math.floor (n), f \u003d n - i, E \u003d 1e-8, r \u003d (f\u003e 0,5 - i & f< 0.5 + e) ? ((i % 2 == 0) ? i: i + 1) : Math.round(n); return d ? r / m: r; }
Sad:

Gaussound (2,5)\u003e 2 Gaussound (3,5)\u003e 4 Gaussound (2.57,1)\u003e 2.6
Decimalni znak u CSS-u:

Budući da se JavaScript često koristi za stvaranje pozicionog pretvorbe HTML elemenata, možete se zapitati što se događa ako generiramo decimalne vrijednosti za naše predmete:

#Box (širina: 63.667731993px;)
Dobra vijest je da će moderni preglednici uzeti u obzir decimalne vrijednosti u blok modelu, uključujući u procentnim ili pikselnim jedinicama mjerenja.

Sortiranje

Vrlo često moramo sortirati sve elemente, na primjer, imamo niz igraćih zapisa, dok bi ih trebale organizirati kao silazni red igrača. Nažalost, metoda standardne vrste () ima neverovatna ograničenja: dobro funkcionira sa često korištenim engleskim riječima, ali odmah se slomi na sastanku s brojevima, jedinstvenim znakovima ili riječima u velikoj mjeri.

Poredaj po abecednom redu

Čini se da bi niz sortiranje abecede trebali biti najjednostavniji zadatak:

Neka voće \u003d ["Butternut skvoš", "marelica", "Cantaloupe"]; voće.sort (); \u003e "Marelica", "Butternut skvoš", "Cantaloupe"]
Ipak, suočeni smo sa problemom čim jedan od elemenata je u velikoj futroli:

Neka voće \u003d ["Butternut skvoš", "APROT", "CANTALOPA"]; voće.sort (); \u003e "Cantaloupe", "APROT", "Butternut skvoš"]
To je zbog činjenice da, prema zadanim postavkama, Sorter uspoređuje prvi simbol predstavljen u Unicodeu. Unicode je jedinstveni kod za bilo koji simbol, bez obzira na platformu, bez obzira na program, bez obzira na jezik. Na primjer, ako pogledate kroz tablicu koda, "A" lik je u + 0061 (u heksadecimalnom sustavu 0x61), dok simbol "C" ima kod u + 0043 (0x43), koji ide prije tablice Unicode Simbol "A".

Da biste sortirali niz koji može sadržavati mješovite registre prvih slova, moramo pretvoriti sve stavke da privremeno u donji registar ili odredimo svoj nalog za sortiranje pomoću metode lokalne osobe sa nekim argumentima. U pravilu, za takav slučaj, bolje je odmah stvoriti funkciju za ponovljenu upotrebu:

Funkcija Alphastrotter (Arr) (Povratak A.LOCALECOMPARE (B, HR ", (" Osjetljivost ":" Baza "));));) pustiti plod \u003d [" magnet "," Cantaloupe "]; ALPHATORT (voće)\u003e
Ako želite dobiti niz sortiran u obrnutu abecednom redu, jednostavno promijenite položaje A i B u funkciju:

Funkcija Alphastrotter (Arr) (Povratak b.localecompare (A, EN ", (" Senzotivnost ":" Baza "));));) pusti plod \u003d [marelica", "Cantaloupe"]; Alphastrott (voće)\u003e ["Cantaloupe", "Butternut squash", "marelica"]
Vrijedno je obraćati pažnju na to da se lokalnoj pametno koristi s argumentima, još uvijek je potrebno zapamtiti da ga podržava IE11 +, za starije verzije, možemo ga koristiti bez argumenata, a u donjem registru:

Funkcijske slučajeve (arr) (Povratak A.TolowerCase (). LocalEcompare (B.TOLowerCase ());));) pusti plod \u003d ["Butternut skvoš", "Cantaloupe"]; Kućišta\u003e [marelica, "Butternut squash", "Cantaloupe"]

Numeričko sortiranje

Sve se to ne odnosi na primjer o kojem smo razgovarali o gore navedenom nizu zapisa o igrama. Uz neke numeričke nizove, sortiranje djeluju upravo savršeno, ali u nekom trenutku rezultat može biti nepredvidiv:

Pusti HighScores \u003d; Highscores.Sort (); \u003e
Činjenica je da metoda sortiranja () proizvodi leksikografsku usporedbu: a to znači da će se brojevi pretvoriti u niz i usporediti se ponovo izvesti mapiranjem prvog znaka ovog niza u simbolima u Unicode tablicama. Stoga moramo odrediti vašu narudžbu sortiranja:

Pusti HighScores \u003d; Highscores.Sort (povratak A - B;)); \u003e
Ponovo, da biste sortirali brojeve u obrnutom redoslijedu, promijenite položaje A i B u funkciju.

Poredaj strukturu slične JSON-u

I na kraju, ako imamo JSON-liku strukturu podataka, predstavljena kao niz zapisa o igri:

Neka postigne pogodak \u003d [("naziv": "Daniel", "Ocjena": 21768), ("Naziv": "Michael", "Ocjena": 33579), ("Ime": "Score": 38395 )];
U ES6 + možete koristiti arrow funkcije:

Rezultati.Sort ((A, B) \u003d\u003e B.Score - A.Score));
Za stare preglednike koji nemaju takvu podršku:

Rezultat.Sort (Povratak A.Score - B.Score));
Kao što vidite, sortiranje u JavaScript-u je prilično očigledna stvar, nadam se da će ovi primjeri olakšati život.

Rad sa funkcijama napajanja

Vježba je operacija, prvobitno definirana kao rezultat višestrukog umnožavanja prirodnog broja na sebi, kvadratni korijen broja A je broj koji se daje na kvadrat. S tim funkcijama bismo se stalno mogli uživati \u200b\u200bu svakodnevnom životu u matematičkim časovima, uključujući i pri izračunavanju područja, volumena ili čak fizičkog modeliranja.

U JavaScriptu je funkcija napajanja predstavljena kao math.pow (), u novom ES7 standardu, u stupnju je predstavljen novi operator vježbanja - "* *".

Ubrzati se u stepen

Da biste izgradili broj u N-uy diplomi, koristite funkciju matematike. PPOW (), gdje je prvi argument broj koji će biti postavljen u diplomu, drugi argument je pokazatelj stupnja:

Math.pow (3.2)\u003e 9
Takav oblik snimanja znači 3 na kvadratu, odnosno 3 × 3, što rezultira rezultatom 9. Može se dati drugi primjer, naravno:

Math.pow (5.3); \u003e 125.
To je 5 na Kubi ili 5 × 5 × 5, jednako 125.

Ecmascript 7 je u principu sljedeća verzija JavaScripta, možemo koristiti novi predloženi operator vježbanja u diplomu - * *, takav oblik snimanja može biti viselniji:

3 ** 2 > 9
Trenutno je podrška za ovaj operator sasvim ograničena, pa se ne preporučuje koristiti.

Snažna funkcija može biti korisna u različitim situacijama. Jednostavan primjer, izračunavanje broja sekundi za sat vremena: matematike.pow (60.2).

Kvadratni i kubni korijen

Math.sqrt () i math.cbrt () su suprotni funkcijama matematike .Pow (). Kao što se sjećamo, kvadratni korijen broja A je broj koji daje kada je kvadrat podignut.

Math.sqrt (9)\u003e 3
Istovremeno, kubični korijen broja A je broj koji daje kada se kocka podigne.

Math.cbrt (125)\u003e 5
Math.CBRT () je nedavno uveden u specipt JavaScript, a samim tim i podržano samo u modernoj preglednicima: Chrome 38+, Firefox i Opera 25+ i Safari 7.1+. Primijetit ćete da Internet Explorer nedostaje na ovoj listi, na ovom popisu ćete pronaći polifilnu MDN.

Primjeri

Naravno, možemo koristiti i ne cijeli broj u jednoj od ovih funkcija:

Math.pow (1,25, 2); \u003e 1.5625 math.cbrt (56.57)\u003e 3.8387991760286138
Imajte na umu da funkcionira prilično dobro kada koristite negativne vrijednosti argumenata:

Math.pow (-5.2)\u003e 25 mather.pow (10, -2)\u003e 0,01
Međutim, za kvadratni korijen neće raditi:

Math.sqrt (-9)\u003e Nan
Iz matematičke analize znamo da u imaginarnom broju razumiju kvadratne korijene iz negativnih brojeva. I to nas može dovesti do druge tehnike rada sa složenim brojevima, ali ovo je druga priča.

Možete koristiti frakcijske vrijednosti u matematici.pow () pronaći kvadratne i kubne korijene brojeve. Kvadratni korijen koristi indikator 0,5:

Math.pow (5, 0.5); // \u003d math.sqrt (5) \u003d 5 ** (1/2)\u003e 2.23606797749979
Međutim, zbog plutajućih hight whims, ne možete precizno pretpostaviti tačan rezultat:

Math.pow (2.23606797749979,2)\u003e 5.0000000000001
U takvim situacijama morat ćete pribjeći prekinuti znakove u brojevima ili zaokruživanju na bilo koju vrijednost.

Neki, za neshvatljive razloge u JavaScript zbunjuju funkciju math.pow () s math.exp (), što je eksponencijalna funkcija za brojeve u cjelini. Napomena: Na engleskom je pokazatelj "eksponent" preveden kao "eksponent", tako da se radije odnosi na engleski jezik, iako postoji alternativna imena pokazatelja kao što su indeks, moć.

Matematičke konstante

Rad sa matematikom u JavaScript-u olakšava se niz ugrađenih konstanti. Ove konstante su svojstva matematičkog objekta. Vrijedno je napomenuti da su konstante napisane u velikoj mjeri, a ne kamelca.

Math.abs, Parseint, Parsefflokat

Rad sa brojevima u JavaScript-u može biti mnogo složenije nego što se čini. Dobivene vrijednosti ne padnu uvijek u očekivane raspone, ponekad rezultat možda neće biti uopće ono što smo očekivali.

Math.abs ()

Metoda math.abs () vraća apsolutnu vrijednost broja, što nam podsjeća na istu matematičku funkciju broja a.

Neka Newval \u003d -57.64; Math.abs (Newval); \u003e 57.64
Math.abs (0) Uvijek vraća nulu, ali ako stavite minus znaku prije -Math.Abs \u200b\u200bfunkcije (num) uvijek ćemo biti negativna vrijednost.

Math.abs (0); \u003e -0.

parseint ()

Znamo da JavaScript razumije da je "15" niz, a ne broj i, na primjer, prilikom raščlanjivanja CSS svojstava sa JavaScriptom s bilo kojom vrijednošću, naši rezultati mogu biti nepredvidivi. Mogli bismo doći na ulaznu liniju predstavljenu kao "17px", a za nas nije retko. Pitanje je kako pretvoriti ovaj niz u stvarnu vrijednost i koristiti je u daljnjim proračunima.

Sintaksa: Parseint (string, radix);

Funkcija Parseint pretvara prvi argument koji se prenosi na njega u niz niza, tumači ga i vraća cijeli broj ili nan vrijednost. Rezultat (ako ne i nan) je cijeli broj i predstavlja prvi argument (string), koji se smatra brojem u navedenom brojevnom sustavu (radix). Na primjer, baza 10 označava pretvorbu iz decimalnog broja, 8 - oktana, 16 heksadecimalnog i tako dalje. Ako je baza veća od 10, tada se slova koriste za označavanje brojeva više od 9. Na primjer, za heksadecimalni brojevi (baza 16), slova od A do F.

Razmotrite primjer rada sa CSS svojstvima, gdje, konvencionalno gledano, možemo dobiti takvu vrijednost:

Neka ELEM \u003d dokument.Dove; Let CenterPoint \u003d prozor.getComputedstyle (ELEM) .Transfordorigin; \u003e "454px 2087.19px"
Možemo podijeliti vrijednosti na prostorima:

Pustiti centre \u003d središnja tačka.Split (""); \u003e ["454px", "2087.19px"]
Međutim, svaki je element i dalje niz, možemo ga riješiti primjene naše funkcije:

Let Centerx \u003d Parseint (centri, 10); \u003e 454 Let Centery \u003d Parseint (centri, 10); \u003e 2087.
Kao što vidite, navodimo broj broja na kojem će se broj pretvoriti u koji je ovaj parametar fakultativan, ali preporučuje se upotreba, u slučaju da ne znate koja će liniju ići na ulaz.

parsefFloat ()

Od gornjeg primjera, vjerovatno ste primijetili da se parseint odbacuje frakcijski dio. U našem slučaju Parsefflokat može raditi sa brojevima plutajućih točaka. Opet, može biti korisno kod raščlanjivanja CSS-a i drugih zadataka, posebno kada rade s plutajućim točki u procentima.

Sintaksa: Parsefloat (string)

Pusti fp \u003d "33.33333%"; Konzola.log (Parsefloat (FP)); \u003e 33.33333
Imajte na umu da u sintaksi parsefloata ne postoji drugi argument.

Razumijemo da su parseint () i parsefloator () izuzetno korisne funkcije, važno je uzeti u obzir da nije potrebno učiniti bez grešaka, tako da je potrebno provjeriti raspon očekivanih vrijednosti i na kraju analizirati rezultat kako bi se osiguralo da su vrijednosti tačne.
Pošaljite anonimno