Često je rezultat izračunavanja broj sa velikim brojem decimalnih mjesta. Ako se ovaj broj koristi za dalje izračune, onda se može ostaviti u ovom obliku. Ali ponekad je potrebno zaokružiti broj, na primjer za prikaz na stranici. JavaScript zaokružuje brojeve koristeći nekoliko metoda.
Metoda Math.round() zaokružuje vrijednost na cijeli broj.
Math.round (broj)
Brojevi su zaokruženi prema matematičkim pravilima. Odnosno, ako se iza decimalnog zareza nalazi broj od 0 do 4, tada se razlomak jednostavno odbacuje. A ako iza decimalnog zareza postoji broj od 5 do 9, tada se razlomak odbacuje, a jedan se dodaje cijelom dijelu. primjer:
JavaScript:
Postoje još dvije metode koje zaokružuju broj na cijeli broj. Metoda Math.floor() se zaokružuje naniže. Odbacuje razlomak broja. I metoda Math.ceil() zaokružuje. Odbacuje razlomak i dodaje jedan cijelom dijelu. primjer:
Naravno, 5 - (-2) je 5+2. Ne zaboravite da nećete dobiti broj 5 u ovoj formuli. Maksimum će biti 4,999999999. Rezultirajuće vrijednosti mogu se zaokružiti na potrebnu tačnost.
Ako su potrebni samo cijeli brojevi, onda se rezultirajuće vrijednosti mogu zaokružiti na najbliži cijeli broj. Jedan se mora dodati maksimumu da bi i ovaj maksimum bio moguć. Formula izgleda ovako:
cijeli broj = Math.floor(min + Math.random() * (maks + 1 - min)
Štampajmo brojeve od 10 do 15:
20 |
za (i=1; i= (veće ili jednako), 3); //false console.log(5>=3); //tačno Prilikom poređenja brojeva sa razlomkom, potrebno je uzeti u obzir greške koje mogu nastati prilikom ovih proračuna. Na primjer, u JavaScript-u zbir brojeva (0,2 + 0,4) nije jednak 0,6: Console.log((0.2+0.4)==0.6); //false Greške nastaju jer se sve kalkulacije rade kompjuterski ili drugim elektronski uređaj proizvodi u 2 brojevnom sistemu. One. Prije izvođenja bilo kakve radnje, računar mora prvo pretvoriti brojeve prikazane u izrazu u drugi brojevni sistem. Ali ne može svaki razlomak decimalni broj biti tačno predstavljen u 2. brojevnom sistemu. Na primjer, broj 0,25 10 in binarni sistem tačno konvertovano. 0,125 × 2 = 0,25 | 0 0,25 × 2 = 0,5 | 0 0,5 × 2 = 1 | 1 0,125 10 = 0,001 2 Na primjer, broj 0,2 10 može se pretvoriti u sistem 2 samo sa određenom tačnošću: 0,2 × 2 = 0,4 | 0 0,4 × 2 = 0,8 | 0 0,8 × 2 = 1,6 | 1 0,6 × 2 = 1,2 | 1 0,2 × 2 = 0,4 | 0 0,4 × 2 = 0,8 | 0 0,8 × 2 = 1,6 | 1 0,6 × 2 = 1,2 | 1 0,2 × 2 = 0,4 | 0 0,4 × 2 = 0,8 | 0 0,8 × 2 = 1,6 | 1 0,6 × 2 = 1,2 | 1 ... 0,2 10 = 0,001100110011... 2 Kao rezultat toga, ove greške će uticati na izračunavanje zbira dva broja i rezultate poređenja. One. Ispostavilo se da će JavaScript zapravo vidjeti ovaj unos na sljedeći način: 0.6000000000000001==0.6 Kada računate ili prikazujete brojeve sa razlomcima, uvijek morate naznačiti preciznost s kojom to želite učiniti. Na primjer, uporedite brojeve do 2 decimale koristeći metode toFixed() i toPrecision(): //metoda toFixed() console.log((0.2+0.4).toFixed(2)==(0.6).toFixed(2)); //tačno //metoda toPrecision() console.log((0.2+0.4).toPrecision(2)==(0.6).toPrecision(2)); //tačno Osnovne matematičke operacijeU JavaScript-u postoje sljedeći matematički operatori: + (sabiranje), - (oduzimanje), * (množenje), / (dijeljenje), % (modulo), ++ (povećati vrijednost za 1), -- (smanji vrijednost za 1 ). 6+3 //9 6-3 //3 6*3 //18 6/3 //2 6%3 //0, tj. 6:3=2 => 6-3*2 => odmor(0) 5%2 //1, tj. 5:2=2(.5) => 5-2*2 => odmor(1) 7,3%2 //1,3, tj. 7.3:2=3(.65) => 7.3-2*3 => rest(1.3) //znak rezultata % operacije jednak je predznaku prve vrijednosti -9%2.5 //-1.5 , tj. 9:2.5=3(.6) => 9-2.5*3 => odmor (1.5) -9%-2.5 //-1.5, tj. 9:2.5=3(.6) => 9-2.5*3 => odmor(1.5) -2%5 //-2, tj. 2:5=0(.4) => 2-5*0 => odmor(2) x = 3; console.log(x++); //izlazi 3, zatim postavlja 4 console.log(x); //4 x = 3; console.log(++x); // postavlja 4 i izlazi x = 5; console.log(x--); //izlazi 5, zatim postavlja 4 console.log(x); //4 x = 5; console.log(--x); // postavlja 4 i izlazi Osim toga, JavaScript ima kombinacijske operatore: x+=y (x=x+y), x-=y (x=x-y), x*=y (x=x*y), x/= y (x=x/y), x%=y (x=x%y). Vrlo često kalkulacije u JavaScript-u ne daju upravo one rezultate koje želimo. Naravno, sa brojevima možemo raditi šta god hoćemo - zaokružiti nagore ili naniže, postaviti opsege, odrezati nepotrebne brojeve na određeni broj decimalnih mjesta, sve ovisi o tome šta želite da radite s ovim brojem u budućnosti.0.1 * 0.2;
> 0.020000000000000004
0.3 - 0.1
> 0.19999999999999998
Jedan od zanimljivih aspekata JavaScript-a je da on zapravo ne pohranjuje cijele brojeve, već radimo odmah sa brojevima s pomičnim zarezom. Ovo, u kombinaciji sa činjenicom da se mnoge razlomke vrijednosti ne mogu izraziti na konačan broj decimalnih mjesta, u JavaScriptu možemo dobiti ovakve rezultate: Za praktične svrhe, ova nepreciznost nije bitna, u našem slučaju govorimo o grešci u kvintilionima dijelova, međutim, to može neke razočarati. Takođe možemo dobiti pomalo čudne rezultate kada radimo sa brojevima koji predstavljaju valute, procente ili veličine fajlova. Da bismo ispravili ove nepreciznosti, samo trebamo moći zaokružiti rezultate, a dovoljno je podesiti decimalnu preciznost. Zaokruživanje brojeva ima praktičnu primjenu, možemo manipulirati brojem unutar određenog raspona, na primjer želimo zaokružiti vrijednost na najbliži cijeli broj umjesto da radimo samo s decimalnim dijelom. Zaokruživanje decimala Da biste skratili decimalu, koristite metodu toFixed ili toPrecision. I jedni i drugi uzimaju jedan argument, koji određuje, respektivno, kolikoAko se toPrecision ne da argument, broj ostaje netaknut neka randNum = 6,25; randNum.toFixed(); > "6" Math.PI.toPrecision(1); > "3" randBroj = 87,335; randNum.toFixed(2); > "87,33" randBroj = 87,337; randNum.toPrecision(3); > "87.3" Neka je randNum = 6,25; neka rounded = parseFloat(randNum.toFixed(1)); console.log(zaokružen); > 6.3 Metode toFixed() i toPrecision() su korisne jer ne samo da mogu odrezati razlomak, već i dodati decimalna mjesta, što je zgodno kada radite s valutom: Neka cijeliNum = 1 neka dollarsCents = wholeNum.toFixed(2); console.log(dollarsCents); > "1.00" Neka je broj = 123.435 num.toPrecision(2); > "1.2e+2" Kako izbjeći greške zaokruživanja decimalama U nekim slučajevima, toFixed i toPrecision zaokružuju vrijednost 5 prema dolje i prema gore:Neka je numTest = 1,005; numTest.toFixed(2); > "1.00" Funkcija round(vrijednost, decimale) (vrati broj(Math.round(value+"e"+decimas)+"e-"+decimal); ) Okrugli(1.005,2); > 1.01 0,1 + 0,2 === 0,3 > netačno Funkcija epsEqu(x, y) (vraćanje Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y));
}
EpsEqu(0,1 + 0,2, 0,3) > istina Funkcija truncated(num) (vraćanje Math.trunc(num * 100) / 100; ) truncated(3.1416) > 3.14 Funkcija truncated(num, decimalPlaces) (neka numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; ) Neka randInt = 35,874993; truncated(randInt,3); > 35.874 Zaokruživanje na najbliži broj Za zaokruživanje decimalnog broja na najbliži broj gore ili dolje, ovisno o tome čemu smo najbliži, koristite Math.round():Math.round(4.3) > 4 Math.round(4.5) > 5 Math.floor(42.23); > 42 Matematički pod (36.93); > 36 Math.floor(-2.5); > -3 Math.trunc(-41,43); > -41 Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil(-36,93); > -36 Zaokruživanje gore/dolje na potreban broj Ako želimo zaokružiti na najbliži umnožak od 5, najlakši način je da kreiramo funkciju koja dijeli broj sa 5, zaokružuje ga, a zatim ga množi za isti iznos:Funkcija roundTo5(num) (vraćanje Math.round(num/5)*5; ) RoundTo5(11); > 10 Funkcija roundToMultiple(num, multiple) (vraćanje Math.round(num/multiple)*multiple; ) Neka je početni broj = 11; neka je višestruko = 10; roundToMultiple(početni broj, višestruki); > 10; Fiksiranje broja u rasponu Postoji mnogo slučajeva u kojima želimo da dobijemo vrijednost x koja se nalazi unutar raspona. Na primjer, možda će nam trebati vrijednost između 1 i 100, ali smo na kraju dobili vrijednost od 123. Da to popravimo, možemo koristiti min (vraća najmanji od skupa brojeva) i max (vraća najveći od bilo kojeg skupa brojeva). U našem primjeru, raspon je od 1 do 100:Neka lowBound = 1; neka visoka granica = 100; neka numInput = 123; neka stegnut = Math.max(lowBound, Math.min(numInput, highBound)); console.log(zategnuto); > 100; Number.prototype.clamp = function(min, max) (vrati Math.min(Math.max(ovo, min), max); ); NumInput.clamp(lowBound, highBound); > 100; Gausovo zaokruživanje Gausovo zaokruživanje, također poznato kao bankarsko zaokruživanje, je mjesto gdje se zaokruživanje za ovaj slučaj događa na najbliži paran broj. Ova metoda zaokruživanja radi bez statističke greške. Najbolje rješenje je predložio Tim Down:Funkcija gaussRound(num, decimalPlaces) ( neka 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;
}
GaussRound(2.5) > 2 GaussRound(3.5) > 4 GaussRound(2.57,1) > 2.6 Budući da se JavaScript često koristi za kreiranje pozicijskih mapiranja za HTML elemente, možda se pitate šta bi se dogodilo kada bismo generirali decimalne vrijednosti za naše elemente: #box ( širina: 63.667731993px; ) Neka voće = ["butternut tikva", "kajsija", "dinja"]; fruit.sort(); > "kajsija", "butternut tikva", "dinja"] Neka voće = ["butternut tikva", "kajsija", "dinja"]; fruit.sort(); > "dinja", "kajsija", "butternut tikva"] Da sortiramo niz koji može sadržavati miješana prva slova, moramo ili sve elemente privremeno pretvoriti u mala slova, ili definirati naš redoslijed sortiranja pomoću metode localeCompare() s nekim argumentima. U pravilu je za takav slučaj bolje odmah kreirati funkciju za ponovnu upotrebu: Funkcija alphaSort(arr) ( arr.sort(function (a, b) ( return a.localeCompare(b, "en", ("osjetljivost": "base")); )); ) let fruit = ["butternut tikva ", "kajsija", "dinja"]; alphaSort(voće) > Funkcija alphaSort(arr) ( arr.sort(function (a, b) ( return b.localeCompare(a, "en", ("osjetljivost": "base")); )); ) let fruit = ["butternut tikva ", "kajsija", "dinja"]; alphaSort(voće) > ["dinja", "butternut tikva", "kajsija"] Funkcija caseSort(arr) ( arr.sort(function (a, b) ( return a.toLowerCase().localeCompare(b.toLowerCase()); )); ) neka voće = ["butternut tikva", "kajsija", "Dinja"]; caseSort(voće) > ["kajsija", "butternut tikva", "dinja"] Numeričko sortiranje Sve ovo se ne odnosi na primjer o kojem smo gore govorili o nizu zapisa igre. S nekim numeričkim nizovima, sortiranje funkcionira sasvim dobro, ali u nekom trenutku rezultat može biti nepredvidljiv:Neka highScores = ; highScores.sort(); > Neka highScores = ; highScores.sort(funkcija(a,b) (vraćanje a - b; )); > Neka rezultati = [ ( "name": "Daniel", "score": 21768 ), ( "name": "Michael", "score": 33579 ), ( "name": "Alison", "score": 38395 ) ]; Scores.sort((a, b) => b.score - a.score)); Scores.sort(funkcija(a, b) (vrati a.score - b.score)); U JavaScriptu, funkcija snage je predstavljena kao Math.pow(), u novom ES7 standardu je uvedena novi operater eksponencijacija - " * * ". Podizanje na stepen Da biste podigli broj na n-ti stepen, koristite funkciju Math.pow(), gdje je prvi argument broj koji će biti podignut na stepen, drugi argument je eksponent:Math.pow(3,2) > 9 Math.pow(5,3); > 125 ECMAScript 7 je sljedeća verzija JavaScript-a, u principu, možemo koristiti novi predloženi operator eksponencijacije - * *, ovaj oblik notacije može biti opisniji: 3 ** 2
> 9
Funkcija napajanja može biti korisna u raznim situacijama. Jednostavan primjer, izračunavanje broja sekundi u satu: Math.pow (60,2). Kvadratni i kubni korijen Math.sqrt() i Math.cbrt() su suprotni od Math.pow(). Kao što se sjećamo, kvadratni korijen od a je broj koji daje a kada je na kvadrat.Math.sqrt(9) > 3 Math.cbrt(125) > 5 Math.pow(1.25, 2); > 1.5625 Math.cbrt(56.57) > 3.8387991760286138 Math.pow(-5,2) > 25 Math.pow(10,-2) > 0,01 Math.sqrt(-9) > NaN Možete koristiti razlomke u Math.pow() da pronađete kvadratni i kubni korijen brojeva. Kvadratni korijen koristi eksponent od 0,5: Math.pow(5, 0,5); // = Math.sqrt(5) = 5 ** (1/2) > 2.23606797749979 Math.pow(2.23606797749979,2) > 5.000000000000001 Neki ljudi, iz nepoznatih razloga, u JavaScript-u brkaju funkciju Math.pow() sa Math.exp() , što je eksponencijalna funkcija za brojeve općenito. Napomena: u engleski"eksponent" je preveden kao "eksponent", tako da je vjerovatnije da se ovo odnosi na govornike engleskog jezika, iako postoje alternativni nazivi za eksponent, kao što su indeks, snaga. Matematičke konstante Rad sa matematikom u JavaScript-u je olakšan brojnim ugrađenim konstantama. Ove konstante su svojstva objekta Math. Vrijedi napomenuti da se konstante pišu velikim slovima, a ne CamelCase notaciji. Math.abs, parseInt, parseFloat Rad sa brojevima u JavaScript-u može biti mnogo komplikovaniji nego što se čini. Dobijene vrijednosti ne spadaju uvijek u očekivane raspone, ponekad rezultat možda uopće nije ono što smo očekivali. Math.abs() Metoda Math.abs() vraća apsolutnu vrijednost broja, što nas podsjeća na sličnu matematičku funkciju za modul broja.Neka je newVal = -57,64; Math.abs(newVal); > 57,64 Math.abs(0); > -0 parseInt() Znamo da JavaScript razumije da je “15” string, a ne broj, i, na primjer, kada analiziramo CSS svojstva koristeći JavaScript, ili primamo bilo koju vrijednost iz nepripremljenog niza, naši rezultati mogu biti nepredvidljivi. Mogli bismo primiti string predstavljen kao "17px" kao ulaz, a to nije neuobičajeno za nas. Pitanje je kako pretvoriti ovaj niz u stvarnu vrijednost i koristiti ga u daljim proračunima.Sintaksa: parseInt(string, radix); ParseInt funkcija konvertuje prvi argument koji joj je proslijeđen u tip stringa, interpretira ga i vraća cijeli broj ili NaN vrijednost. Rezultat (ako nije NaN) je cijeli broj i prvi je argument (string), tretiran kao broj u navedenom radiksu. Na primjer, baza 10 označava konverziju iz decimalni broj, 8 - oktalno, 16 - heksadecimalno i tako dalje. Ako je osnova veća od 10, onda se slova koriste za predstavljanje brojeva veći od 9. Na primjer, za heksadecimalni brojevi(baza 16) koriste se slova od A do F. Pogledajmo primjer rada sa CSS svojstvima, gdje, relativno govoreći, možemo dobiti sljedeću vrijednost: Neka elem = document.body; let centerPoint = window.getComputedStyle(elem).transformOrigin; > "454px 2087.19px" Neka centri = centerPoint.split(" "); > ["454px", "2087.19px"] Neka centerX = parseInt(centers, 10); > 454 neka centarY = parseInt(centri, 10); >2087 Sintaksa: parseFloat(string) Neka je FP = "33,33333%"; console.log(parseFloat(FP)); > 33,33333 Iako razumijemo da su parseInt() i parseFloat() izuzetno korisne funkcije, važno je imati na umu da nisu bez grešaka, pa je potrebno provjeriti raspon očekivanih vrijednosti i na kraju analizirati rezultat kako biste osigurali da su dobijene vrijednosti tačne. |