Yksinkertaiset pyöristyssäännöt javascriptissä. Tutkimme menetelmiä ja käytämme niitä käytännössä. Numeroiden pyöristysmenetelmät JavaScriptissä

Usein laskelmat tuottavat tuloksia, jotka ovat haluttujen rajojen ulkopuolella. Tämän seurauksena se on pantava täytäntöön JavaScript pyöristys tiettyyn arvoon asti.

Miksi pyöreät numerot?

JavaScript ei tallenna kokonaislukuja, koska niiden arvot esitetään liukulukuina. Monia murtolukuja ei voida esittää lukuina, joissa on tietty rajallinen määrä desimaalipaikkoja, joten JavaScript voi tuottaa seuraavanlaisia ​​tuloksia:

0.1 * 0.2; > 0.020000000000000004

Käytännössä tämä ei vaikuta mitenkään me puhumme noin 2 kvintiljoonan virhe. Tämä voi kuitenkin vaikuttaa tuloksiin käytettäessä lukuja, jotka edustavat valuuttaarvoja, prosentteja tai tiedostokokoa. Siksi sinun on tehtävä tai tietyn desimaalin tarkkuudella.

Desimaalilukujen pyöristys

"Leikkaa" desimaalilukua käyttämällä toFixed()- tai toPrecision()-menetelmiä. Molemmat ottavat yhden argumentin, joka määrittää tulokseen sisällytettävien merkitsevien ja desimaalien määrän:

  • jos toFixed():lle ei ole määritetty argumenttia, oletusarvo on 0, eli ei desimaalipaikkoja; argumentin enimmäisarvo on 20;
  • jos toPrecision(:lle) ei anneta argumenttia, numeroa ei muuteta.

var randNum = 6,25; randNum.toFixed(); > "6" Math.PI.toPrecision(1); > "3" var randNum = 87,335; randNum.toFixed(2); > "87,33" var randNum = 87,337; randNum.toPrecision(3); > "87.3"

Huomautus

Sekä toFixed() että toPrecision palauttavat tuloksen pyöristetyn merkkijonoesityksen luvun sijaan. Tämä tarkoittaa, että pyöristettyjen lisääminen randNumiin johtaa merkkijonojen ketjuun yhden luvun sijaan:

console.log(randNum + pyöristetty); > "6.256"

Jos haluat JavaScriptin pyöristävän luvun lähimpään sadasosaan, käytä parseFloat() -funktiota:

var randNum = 6,25; var pyöristetty = parseFloat(randNum.toFixed(1)); console.log(pyöristetty); > 6.3

toFixed() ja toPrecision() ovat myös hyödyllisiä menetelmiä katkaista Suuri määrä desimaalin tarkkuudella. Tämä on hyödyllistä, kun työskentelet rahayksikköjä edustavien lukujen kanssa:

var kokonaisluku = 1 var dollariaSentti = kokonaisluku.Kiinteä(2); console.log(dollarscentit); > "1.00"

Huomaa, että jos numerossa on enemmän numeroita kuin määritetty tarkkuus, toPrecision tulostaa tuloksen tieteellisessä muodossa:

var num = 123,435 num.toPrecision(2); > "1.2e+2"

Virheiden välttäminen desimaalien pyöristämisessä

Joissakin tapauksissa Kiinteään ja Precision-koneeseen JavaScript pyöristää 5 alaspäin, eikä enempää:

var numTest = 1,005; numTest.toFixed(2); > 1;

Yllä olevan esimerkin tuloksen tulisi olla 1,01, ei 1. Jos haluat välttää tämän virheen, suosittelen eksponentiaalilukujen käyttöä:

funktio round(arvo, desimaalit) ( return Number(Math.round(arvo+"e"+desimaalit)+"e-"+desimaalit); )

Sovellus:

kierros(1.005,2); > 1.01

Jos tarvitset pyöristystäkin kestävämmän ratkaisun, se on saatavilla osoitteessa MDN.

Pyöristys epsilonilla

Vaihtoehtoinen menetelmä JavaScript pyöristetään kymmenesosiksi otettiin käyttöön ES6:ssa ( tunnetaan myös nimellä JavaScript 2015). « Kone epsilon " tarjoaa kohtuullisen virhemarginaalin verrattaessa kahta liukulukua. Ilman pyöristystä vertailut voivat tuottaa seuraavanlaisia ​​tuloksia:

0,1 + 0,2 === 0,3 > epätosi

Math.EPSILON:ia voidaan käyttää funktiossa kelvollisen vertailun saamiseksi:

funktio epsEqu(x, y) ( palauttaa Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }

Funktiolla on kaksi argumenttia: yksi sisältää laskelmat, toinen odotetun (pyöristetyn) tuloksen. Se palauttaa näiden kahden parametrin vertailun:

epsEqu(0.1 + 0.2; 0.3) > tosi

Kaikki nykyaikaiset selaimet tukevat matemaattiset funktiot ES6. Mutta jos sinun on tarjottava tukea vanhemmissa selaimissa, sinun on käytettävä polyfills.

Desimaalilukujen katkaisu

Kaikki aiemmin esitetyt menetelmät toimivat JavaScript pyöristetään kymmenesosiksi. Katkaistaksesi positiivisen luvun kahden desimaalin tarkkuudella, kerro se 100:lla, katkaise se uudelleen ja jaa tulos 100:lla:

funktio katkaistu(num) ( return Math.trunc(num * 100) / 100; ) katkaistu(3,1416) > 3,14

Jos tarvitset jotain joustavampaa, voit käyttää bittikohtaista operaattoria:

funktio typistetty(num, desimaalipaikat) ( var numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )

Käyttö:

var randInt = 35,874993; katkaistu(randInt,3); > 35,874

Pyöristä lähimpään numeroon

Toteuttaa JavaScript pyöristys lähimpään kokonaislukuun, Math.round():ta käytetään:

Math.round(4.3) > 4 Math.round(4.5) > 5

Ota huomioon, että " puolet arvoista", kuten .5, pyöristetään ylöspäin.

Pyöristä alaspäin lähimpään kokonaislukuun

Jos haluat pyöristää alaspäin, käytä Math.floor()-menetelmää:

Math.floor(42.23); > 42 Math.floor(36.93); > 36

Pyöristämisellä alaspäin on yksi suunta kaikille luvuille, myös negatiivisille. Tämä voidaan kuvitella pilvenpiirtäjänä, jossa on ääretön määrä kerroksia, myös perustustason alapuolella ( edustaa negatiivisia lukuja ). Jos olet hississä kellarikerrosten 2 ja 3 välissä ( joka vastaa arvoa -2,5), Math.floor vie sinut kerrokseen -3:

Math.floor (-2,5); > -3

Jos haluat välttää tämän, käytä JavaScript Math pyöristystä käyttämällä Math.trunc() , jota tuetaan kaikissa nykyaikaisissa selaimissa (paitsi IE/Edge):

Math.trunc(-41,43); > -41

MDN tarjoaa myös kolmirivinen polyfill, joka tarjoaa tuen Math.truncille vanhemmissa selaimissa ja IE/Edgessä.

Pyöristä ylöspäin lähimpään kokonaislukuun

Jos haluat pyöristää desimaalilukuja ylöspäin, käytä Math.ceil -tiedostoa. Tätä menetelmää voidaan pitää myös äärettömänä hissinä: Math.ceil vie sinut aina “ylös”, riippumatta siitä, onko luku negatiivinen vai positiivinen:

Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil (-36,93); -36

Pyöristä lähimpään kerrannaiseen

Jos sinun on pyöristettävä arvo lähimpään 5:n kerrannaiseen, luo funktio, joka jakaa luvun 5:llä, pyöristää sen ja kertoo sitten tuloksen samalla arvolla:

funktio roundTo5(num) ( return Math.round(num/5)*5; )

Käyttö:

roundTo5(11); > 10

Jos tarvitset JavaScriptin pyöristämään kahteen desimaaliin, voit välittää sekä siemen- että kerrannaisarvon funktiolle:

funktio roundToMultiple(num, multiple) ( return Math.round(num/multiple)*multiple; )

Käytä funktiota lisäämällä pyöristettävä numero ja kerrannainen sen kutsuun:

var alkuperäinenNumber = 11; var moninkertainen = 10; roundToMultiple(alkuperäinenNumber, useat); > 10;

Pyöristääksesi arvot vain ylös tai alas, vaihda pyöreä toiminnossa kattoon tai lattiaan.

Aluesidonta

Joskus sinun on saatava x:lle arvo, jonka on oltava tietyllä alueella. Tarvitsemme esimerkiksi arvon 1 - 100, mutta saamme arvon 123. Voit korjata tämän käyttämällä min() ( palauttaa pienimmän luvun) ja max ( palauttaa suurimman sallitun määrän).

Käyttö:

var alaraja = 1; var highBound = 100; var numInput = 123; var clamped = Math.max(alaraja, matemaattinen.min(numInput, highBound)); console.log(clamped); > 100;

Voit luoda Number-luokalle funktion tai laajennuksen:

Number.prototype.clamp = funktio(min, max) ( return Math.min(Math.max(this, min), max); );

Käyttö:

(numInput).clamp(lowBound, highBound);

Gaussin pyöristys

Gaussin pyöristys ("pankkitoiminta", konvergentti tai hollantilainen) on pyöristysmenetelmä ilman tilastovirhettä. Vakio JavaScript pyöristys antaa joskus virheitä iso puoli. Gaussin pyöristys välttää tämän virheen pyöristämällä lähimpään parilliseen numeroon. Paras päätös, jonka tiedän.

Hei. Tänään Javascriptiä käsittelevässä sarakkeessa tarkastellaan, kuinka se tehdään javascriptin määrä desimaalit liukulukuissa. Esimerkiksi, sinun on jätettävä 3 desimaalin tarkkuutta tulostettaessa tai vain kaksi.

Tehtävä: javascript desimaalien määrä

Edessämme on siis tehtävä: on laskelmien tulos, jossa on numeroita ennen desimaalipistettä ja desimaalipilkun jälkeen. Desimaali. Oletetaan, että tulos on tämä: 1538.9891200153. Mutta tulostettaessa pitäisi saada määrää kuvaava luku, jossa ennen desimaalipilkkua on setelien lukumäärä ja sen jälkeen kopekkojen määrä.

On olemassa useita tapoja ratkaista tämä ongelma.

Ratkaisu 1: JavaScript desimaalien määrä käyttäen toFixed-menetelmää

toFixed on sisäänrakennettu JavaScript-menetelmä, joka koskee mitä tahansa lukua ja ottaa pyöristystarkkuuden (eli desimaalien määrän) parametrina.

Var num = 1538.9891200153; num_str=num.toFixed(); //num_str=1538; num_str=num.toFixed(2); //num_str=1538.98; num_str=num.toFixed(5); //num_str=1538.98912;

Tämän funktion tarkkuusparametrin tulee olla vähintään 0 (ei hyväksy negatiivisia arvoja) ja enintään 20.

Voit myös tehdä ilman muuttujaa, esimerkiksi näin:

Num_str=(1538.9891200153).toFixed(2); //num_str=1538.98;

Ratkaisu 2: javascript desimaalien määrä käyttäen toPrecision-menetelmää

Tämä ratkaisu perustuu samaan sisäänrakennettuun JavaScript-menetelmään. Erottuva ominaisuus Tässä menetelmässä syötteeksi otettu parametri ei osoita tarkkuutta (desimaalien lukumäärää), vaan desimaalien kokonaismäärää (sekä ennen desimaalipistettä että sen jälkeen).

Var num = 1538.9891200153; num_str=num.toPrecision(5); //num_str=1538.9; num_str=num.toPrecision(7); //num_str=1538.989;

Ratkaisu ilman desimaaleja: javascript desimaalien määrä

Jos sinun on poistettava desimaalit kokonaan, eli sinun on pyöristettävä murto kokonaislukuun, voit käyttää Math-luokan toimintoja: pyöreä, katto ja lattia.
Pyöreä - pyöristää ylös tai alas (numerosta riippuen). Jos desimaalipilkun jälkeen oleva arvo on yli puolet, se pyöristetään ylöspäin, jos pienempi, se pyöristetään alaspäin. Eli jos 0,51 muuttuu 1:ksi, jos 0,49 muuttuu 0:ksi.

Katto - englannista. Katto pyörii aina ylöspäin.

Lattia - englanniksi. Lattia pyöristyy aina alaspäin.

Var num = 1538.9891200153; num_str=Math.round(num); //num_str=1539; num_str=Math.floor(num); //num_str=1538; num_str=Math.ceil(num); //num_str=1539;

Siinä kaikki. Toivottavasti tämä huomautus auttoi sinua ratkaisemaan ongelmasi. Jos jokin ei toimi, kysy kysymyksiä vihreällä "Kysy asiantuntijalta" -painikkeella tai kommenteissa.

Usein laskelmat tuottavat tuloksia, jotka ovat haluttujen rajojen ulkopuolella. Tämän seurauksena se on pantava täytäntöön JavaScript pyöristys tiettyyn arvoon asti.

Miksi pyöreät numerot?

JavaScript ei tallenna kokonaislukuja, koska niiden arvot esitetään liukulukuina. Monia murtolukuja ei voida esittää lukuina, joissa on tietty rajallinen määrä desimaalipaikkoja, joten JavaScript voi tuottaa seuraavanlaisia ​​tuloksia:

0.1 * 0.2; > 0.020000000000000004

Käytännössä tällä ei ole mitään merkitystä, koska puhumme 2 kvintiljoonasosan virheestä. Tämä voi kuitenkin vaikuttaa tuloksiin käytettäessä lukuja, jotka edustavat valuuttaarvoja, prosentteja tai tiedostokokoa. Siksi sinun on tehtävä tai tietyn desimaalin tarkkuudella.

Desimaalilukujen pyöristys

"Leikkaa" desimaalilukua käyttämällä toFixed()- tai toPrecision()-menetelmiä. Molemmat ottavat yhden argumentin, joka määrittää tulokseen sisällytettävien merkitsevien ja desimaalien määrän:

  • jos toFixed():lle ei ole määritetty argumenttia, oletusarvo on 0, eli ei desimaalipaikkoja; argumentin enimmäisarvo on 20;
  • jos toPrecision(:lle) ei anneta argumenttia, numeroa ei muuteta.

var randNum = 6,25; randNum.toFixed(); > "6" Math.PI.toPrecision(1); > "3" var randNum = 87,335; randNum.toFixed(2); > "87,33" var randNum = 87,337; randNum.toPrecision(3); > "87.3"

Huomautus

Sekä toFixed() että toPrecision palauttavat tuloksen pyöristetyn merkkijonoesityksen luvun sijaan. Tämä tarkoittaa, että pyöristettyjen lisääminen randNumiin johtaa merkkijonojen ketjuun yhden luvun sijaan:

console.log(randNum + pyöristetty); > "6.256"

Jos haluat JavaScriptin pyöristävän luvun lähimpään sadasosaan, käytä parseFloat() -funktiota:

var randNum = 6,25; var pyöristetty = parseFloat(randNum.toFixed(1)); console.log(pyöristetty); > 6.3

toFixed() ja toPrecision() ovat myös hyödyllisiä menetelmiä useiden desimaalien lyhentämiseen. Tämä on hyödyllistä, kun työskentelet rahayksikköjä edustavien lukujen kanssa:

var kokonaisluku = 1 var dollariaSentti = kokonaisluku.Kiinteä(2); console.log(dollarscentit); > "1.00"

Huomaa, että jos numerossa on enemmän numeroita kuin määritetty tarkkuus, toPrecision tulostaa tuloksen tieteellisessä muodossa:

var num = 123,435 num.toPrecision(2); > "1.2e+2"

Virheiden välttäminen desimaalien pyöristämisessä

Joissakin tapauksissa Kiinteään ja Precision-koneeseen JavaScript pyöristää 5 alaspäin, eikä enempää:

var numTest = 1,005; numTest.toFixed(2); > 1;

Yllä olevan esimerkin tuloksen tulisi olla 1,01, ei 1. Jos haluat välttää tämän virheen, suosittelen eksponentiaalilukujen käyttöä:

funktio round(arvo, desimaalit) ( return Number(Math.round(arvo+"e"+desimaalit)+"e-"+desimaalit); )

Sovellus:

kierros(1.005,2); > 1.01

Jos tarvitset pyöristystäkin kestävämmän ratkaisun, se on saatavilla osoitteessa MDN.

Pyöristys epsilonilla

Vaihtoehtoinen menetelmä JavaScript pyöristetään kymmenesosiksi otettiin käyttöön ES6:ssa ( tunnetaan myös nimellä JavaScript 2015). « Kone epsilon" tarjoaa kohtuullisen virhemarginaalin verrattaessa kahta liukulukua. Ilman pyöristystä vertailut voivat tuottaa seuraavanlaisia ​​tuloksia:

0,1 + 0,2 === 0,3 > epätosi

Math.EPSILON:ia voidaan käyttää funktiossa kelvollisen vertailun saamiseksi:

funktio epsEqu(x, y) ( palauttaa Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }

Funktiolla on kaksi argumenttia: yksi sisältää laskelmat, toinen odotetun (pyöristetyn) tuloksen. Se palauttaa näiden kahden parametrin vertailun:

epsEqu(0.1 + 0.2; 0.3) > tosi

Kaikki nykyaikaiset selaimet tukevat ES6:n matemaattisia toimintoja. Mutta jos sinun on tarjottava tukea vanhemmissa selaimissa, sinun on käytettävä polyfills.

Desimaalilukujen katkaisu

Kaikki aiemmin esitetyt menetelmät toimivat JavaScript pyöristetään kymmenesosiksi. Katkaistaksesi positiivisen luvun kahden desimaalin tarkkuudella, kerro se 100:lla, katkaise se uudelleen ja jaa tulos 100:lla:

funktio katkaistu(num) ( return Math.trunc(num * 100) / 100; ) katkaistu(3,1416) > 3,14

Jos tarvitset jotain joustavampaa, voit käyttää bittikohtaista operaattoria:

funktio typistetty(num, desimaalipaikat) ( var numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )

Käyttö:

var randInt = 35,874993; katkaistu(randInt,3); > 35,874

Pyöristä lähimpään numeroon

Toteuttaa JavaScript pyöristys lähimpään kokonaislukuun, Math.round():ta käytetään:

Math.round(4.3) > 4 Math.round(4.5) > 5

Ota huomioon, että " puolet arvoista", kuten .5, pyöristetään ylöspäin.

Pyöristä alaspäin lähimpään kokonaislukuun

Jos haluat pyöristää alaspäin, käytä Math.floor()-menetelmää:

Math.floor(42.23); > 42 Math.floor(36.93); > 36

Pyöristämisellä alaspäin on yksi suunta kaikille luvuille, myös negatiivisille. Tämä voidaan kuvitella pilvenpiirtäjänä, jossa on ääretön määrä kerroksia, myös perustustason alapuolella ( edustavat negatiivisia lukuja). Jos olet hississä kellarikerrosten 2 ja 3 välissä ( joka vastaa arvoa -2,5), Math.floor vie sinut kerrokseen -3:

Math.floor (-2,5); > -3

Jos haluat välttää tämän, käytä JavaScript Math pyöristystä käyttämällä Math.trunc() , jota tuetaan kaikissa nykyaikaisissa selaimissa (paitsi IE/Edge):

Math.trunc(-41,43); > -41

MDN tarjoaa myös kolmirivinen polyfill, joka tarjoaa tuen Math.truncille vanhemmissa selaimissa ja IE/Edgessä.

Pyöristä ylöspäin lähimpään kokonaislukuun

Jos haluat pyöristää desimaalilukuja ylöspäin, käytä Math.ceil -tiedostoa. Tätä menetelmää voidaan pitää myös äärettömänä hissinä: Math.ceil vie sinut aina “ylös”, riippumatta siitä, onko luku negatiivinen vai positiivinen:

Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil (-36,93); -36

Pyöristä lähimpään kerrannaiseen

Jos sinun on pyöristettävä arvo lähimpään 5:n kerrannaiseen, luo funktio, joka jakaa luvun 5:llä, pyöristää sen ja kertoo sitten tuloksen samalla arvolla:

funktio roundTo5(num) ( return Math.round(num/5)*5; )

Käyttö:

roundTo5(11); > 10

Jos tarvitset JavaScriptin pyöristämään kahteen desimaaliin, voit välittää sekä siemen- että kerrannaisarvon funktiolle:

funktio roundToMultiple(num, multiple) ( return Math.round(num/multiple)*multiple; )

Käytä funktiota lisäämällä pyöristettävä numero ja kerrannainen sen kutsuun:

var alkuperäinenNumber = 11; var moninkertainen = 10; roundToMultiple(alkuperäinenNumber, useat); > 10;

Pyöristääksesi arvot vain ylös tai alas, vaihda pyöreä toiminnossa kattoon tai lattiaan.

Aluesidonta

Joskus sinun on saatava x:lle arvo, jonka on oltava tietyllä alueella. Tarvitsemme esimerkiksi arvon 1 - 100, mutta saamme arvon 123. Voit korjata tämän käyttämällä min() ( palauttaa pienimmän luvun) ja max ( palauttaa suurimman sallitun määrän).

Käyttö:

var alaraja = 1; var highBound = 100; var numInput = 123; var clamped = Math.max(alaraja, matemaattinen.min(numInput, highBound)); console.log(clamped); > 100;

Voit luoda Number-luokalle funktion tai laajennuksen:

Number.prototype.clamp = funktio(min, max) ( return Math.min(Math.max(this, min), max); );

Käyttö:

(numInput).clamp(lowBound, highBound);

Gaussin pyöristys

Gaussin pyöristys ("pankkitoiminta", konvergentti tai hollantilainen) on pyöristysmenetelmä ilman tilastovirhettä. Vakio JavaScript pyöristys joskus antaa virheitä laajempaan suuntaan. Gaussin pyöristys välttää tämän virheen pyöristämällä lähimpään parilliseen numeroon. Paras ratkaisu jonka tiedän.

Usein laskelmat tuottavat tuloksia, jotka ovat haluttujen rajojen ulkopuolella. Tämän seurauksena se on pantava täytäntöön JavaScript pyöristys tiettyyn arvoon asti.

Miksi pyöreät numerot?

JavaScript ei tallenna kokonaislukuja, koska niiden arvot esitetään liukulukuina. Monia murtolukuja ei voida esittää lukuina, joissa on tietty rajallinen määrä desimaalipaikkoja, joten JavaScript voi tuottaa seuraavanlaisia ​​tuloksia:

0.1 * 0.2; > 0.020000000000000004

Käytännössä tällä ei ole mitään merkitystä, koska puhumme 2 kvintiljoonasosan virheestä. Tämä voi kuitenkin vaikuttaa tuloksiin käytettäessä lukuja, jotka edustavat valuuttaarvoja, prosentteja tai tiedostokokoa. Siksi sinun on tehtävä tai tietyn desimaalin tarkkuudella.

Desimaalilukujen pyöristys

kohteeseen " trimmata» desimaaliluku, käytetään toFixed()- tai toPrecision()-menetelmiä. Molemmat ottavat yhden argumentin, joka määrittää tulokseen sisällytettävien merkitsevien ja desimaalien määrän:

  • jos toFixed():lle ei ole määritetty argumenttia, oletusarvo on 0, eli ei desimaalipaikkoja; argumentin enimmäisarvo on 20;
  • jos toPrecision(:lle) ei anneta argumenttia, numeroa ei muuteta.
var randNum = 6,25; randNum.toFixed(); > "6" Math.PI.toPrecision(1); > "3" var randNum = 87,335; randNum.toFixed(2); > "87,33" var randNum = 87,337; randNum.toPrecision(3); > "87.3"

Huomautus

Sekä toFixed() että toPrecision palauttavat tuloksen pyöristetyn merkkijonoesityksen luvun sijaan. Tämä tarkoittaa, että pyöristettyjen lisääminen randNumiin johtaa merkkijonojen ketjuun yhden luvun sijaan:

Console.log(randNum + pyöristetty); > "6.256"

Jos haluat JavaScriptin pyöristävän luvun lähimpään sadasosaan, käytä parseFloat() -funktiota:

Var randNum = 6,25; var pyöristetty = parseFloat(randNum.toFixed(1)); console.log(pyöristetty); > 6.3

toFixed() ja toPrecision() ovat myös hyödyllisiä menetelmiä useiden desimaalien lyhentämiseen. Tämä on hyödyllistä, kun työskentelet rahayksikköjä edustavien lukujen kanssa:

Muutt kokonaisluku = 1 var dollariaSentti = kokonaisluku.Kiinteä(2); console.log(dollarsCents); > "1.00"

Huomaa, että jos numerossa on enemmän numeroita kuin määritetty tarkkuus, toPrecision tulostaa tuloksen tieteellisessä muodossa:

Var num = 123,435 num.to Precision(2); > "1.2e+2"

Virheiden välttäminen desimaalien pyöristämisessä

Joissakin tapauksissa Kiinteään ja Precision-koneeseen JavaScript pyöristää 5 alaspäin, eikä enempää:

Var numTest = 1,005; numTest.toFixed(2); > 1;

Yllä olevan esimerkin tuloksen tulisi olla 1,01, ei 1. Jos haluat välttää tämän virheen, suosittelen eksponentiaalilukujen käyttöä:

Funktio pyöreä(arvo, desimaalit) ( palauttaa Numero(Math.round(arvo+"e"+desimaalit)+"e-"+desimaalit); )

Sovellus:

Kierros(1,005,2); > 1.01

Jos tarvitset pyöristystäkin kestävämmän ratkaisun, se on saatavilla osoitteessa MDN.

Pyöristys epsilonilla

Vaihtoehtoinen menetelmä JavaScript pyöristetään kymmenesosiksi otettiin käyttöön ES6:ssa ( tunnetaan myös nimellä JavaScript 2015). "Kone epsilon" tarjoaa kohtuullisen virhemarginaalin verrattaessa kahta liukulukua. Ilman pyöristystä vertailut voivat tuottaa seuraavanlaisia ​​tuloksia:

0,1 + 0,2 === 0,3 > epätosi

Math.EPSILON:ia voidaan käyttää funktiossa kelvollisen vertailun saamiseksi:

Funktio epsEqu(x, y) ( palauttaa Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }

Funktiolla on kaksi argumenttia: yksi sisältää laskelmia, toinen on odotettavissa ( pyöristetty) tulos. Se palauttaa näiden kahden parametrin vertailun:

EpsEqu(0,1 + 0,2, 0,3) > tosi

Kaikki nykyaikaiset selaimet tukevat ES6:n matemaattisia toimintoja. Mutta jos sinun on tarjottava tukea vanhemmissa selaimissa, sinun on käytettävä polyfills.

Desimaalilukujen katkaisu

Kaikki aiemmin esitetyt menetelmät toimivat JavaScript pyöristetään kymmenesosiksi. Katkaistaksesi positiivisen luvun kahden desimaalin tarkkuudella, kerro se 100:lla, katkaise se uudelleen ja jaa tulos 100:lla:

Funktio katkaistu(num) ( return Math.trunc(num * 100) / 100; ) typistetty(3,1416) > 3,14

Jos tarvitset jotain joustavampaa, voit käyttää bittikohtaista operaattoria:

Funktio typistetty(num, desimaalipaikat) ( var numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )

Käyttö:

Var randInt = 35,874993; katkaistu(randInt,3); > 35,874

Pyöristä lähimpään numeroon

Toteuttaa JavaScript pyöristys lähimpään kokonaislukuun, Math.round():ta käytetään:

Math.round(4.3) > 4 Math.round(4.5) > 5

Ota huomioon, että " puolet arvoista", kuten .5, pyöristetään ylöspäin.

Pyöristä alaspäin lähimpään kokonaislukuun

Jos haluat pyöristää alaspäin, käytä Math.floor()-menetelmää:

Math.floor(42.23); > 42 Math.floor(36.93); > 36

Pyöristys" alas" on yksi suunta kaikille luvuille, myös negatiivisille. Tämä voidaan kuvitella pilvenpiirtäjänä, jossa on ääretön määrä kerroksia, mukaan lukien perustustason alapuolella ( edustavat negatiivisia lukuja). Jos olet hississä kellarikerrosten 2 ja 3 välissä ( joka vastaa arvoa -2,5), Math.floor vie sinut kerrokseen -3:

Math.floor (-2,5); > -3

Jos haluat välttää tämän, käytä JavaScript Math pyöristystä käyttämällä Math.trunc(), jota tuetaan kaikissa nykyaikaisissa selaimissa ( paitsi IE/Edge):

Math.trunc(-41,43); > -41

MDN tarjoaa myös kolmirivinen polyfill, joka tarjoaa tuen Math.truncille vanhemmissa selaimissa ja IE/Edgessä.

Pyöristä ylöspäin lähimpään kokonaislukuun

Jos haluat pyöristää desimaalilukuja ylöspäin, käytä Math.ceil -tiedostoa. Tämän menetelmän vaikutusta voidaan pitää myös loputtomana hissinä: Math.ceil vie sinut aina " ylös", riippumatta siitä, onko luku negatiivinen vai positiivinen:

Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil (-36,93); -36

Pyöristä lähimpään kerrannaiseen

Jos sinun on pyöristettävä arvo lähimpään 5:n kerrannaiseen, luo funktio, joka jakaa luvun 5:llä, pyöristää sen ja kertoo sitten tuloksen samalla arvolla:

Funktio roundTo5(num) ( paluu Math.round(num/5)*5; )

Käyttö:

RoundTo5(11); > 10

Jos tarvitset JavaScriptin pyöristämään kahteen desimaaliin, voit välittää sekä siemen- että kerrannaisarvon funktiolle:

Funktio roundToMultiple(num, multiple) ( return Math.round(num/multiple)*multiple; )

Käytä funktiota lisäämällä pyöristettävä numero ja kerrannainen sen kutsuun:

Muutt alkuluku = 11; var moninkertainen = 10; roundToMultiple(alkuperäinenNumber, useat); > 10;

Pyöristääksesi arvot vain ylös tai alas, vaihda pyöreä toiminnossa kattoon tai lattiaan.

Aluesidonta

Joskus sinun on saatava x:lle arvo, jonka on oltava tietyllä alueella. Tarvitsemme esimerkiksi arvon 1 - 100, mutta saamme arvon 123. Voit korjata tämän käyttämällä min() ( palauttaa pienimmän luvun) ja max ( palauttaa suurimman sallitun määrän).

Käyttö:

Muuttuma alaraja = 1; var highBound = 100; var numInput = 123; var clamped = Math.max(alaraja, matemaattinen.min(numInput, highBound)); console.log(clamped); > 100;

Voit luoda Number-luokalle funktion tai laajennuksen:

Number.prototype.clamp = funktio(min, max) ( return Math.min(Math.max(this, min), max); );

Käyttö:

(numInput).clamp(lowBound, highBound);

Gaussin pyöristys

Gaussin pyöristys (" pankkitoimintaa", konvergentti tai hollantilainen) on pyöristysmenetelmä ilman tilastovirhettä. Vakio JavaScript pyöristys joskus antaa virheitä laajempaan suuntaan. Gaussin pyöristys välttää tämän virheen pyöristämällä lähimpään parilliseen numeroon. Paras ratkaisu jonka tiedän on:

Funktio gaussRound(num, desimaalipaikat) ( var d = desimaalipaikat || 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; }

Esimerkkejä käytöstä:

GaussRound(2.5) > 2 gaussRound(3.5) > 4 gaussRound(2.57,1) > 2.6

Desimaalit CSS:ssä

Koska JavaScriptiä käytetään usein paikkatietojen saamiseen tai HTML-elementtien muuntamiseen, voidaan miettiä, mitä tapahtuisi, jos luomme elementeille desimaaliarvoja:

#box (leveys: 63,667731993px; )

Nykyaikaiset selaimet tukee desimaaliarvoja lohko malli, mukaan lukien prosentti- ja pikseliyksiköt.

Artikkelin "JavaScript Rounding Recipes" -käännöksen valmisti Verkkosivuston rakentamisen A-Z-projektin ystävällinen tiimi.