JavaScript zaokrouhlení až 2 znaky. Metody zaokrouhlování čísel v JavaScriptu

Dobrý den, milenci JavaScript-a. Už jste si všimli, že tento jazyk je velmi mimořádný a v každé sekci vyniká pro své zvláštnosti a neobvyklá technická řešení. Proto je dnešní publikace věnována tématu: zaokrouhlení JavaScriptu.

Po přečtení aktuálního článku zjistíte, proč je nutné zaokrouhlit čísla, jaké metody a vlastnosti v JS provést tuto funkci, stejně jako rozdělení 0. Bez změny principů, připojím příklady klíčových bodů a podrobně napište každou akci. Začněme se učit!

Důležité poznámky o číslech

Chcete-li začít, nezapomeňte, že v JS Všechny druhy čísel (zlomkové a celé číslo) odkazují na typ Číslo. Kromě toho jsou všechny z nich 64-bit, protože jsou uloženy ve formátu "Dvojitá přesnost", který je také známý pod normou IEEE-754.

Vytvořil numerické proměnné s obvyklým způsobem:

var numb \u003d 35; // přirozené číslo

var dob \u003d 0,93; // desetinný reprezentace

var numb16 \u003d 0xff; // 16-richerijský systém

Podporuje další číselné zobrazení. Takže můžete také vytvořit čísla s plovoucí desetinnou čárkou (někdy se nazývají "čísla ve vědeckém formátu").

V závislosti na podporu velmi zajímavé metody tolocalestring ()Které formátuje všechny číselné parametry podle specifikací předepsaných v ECMA 402. Vzhledem k této velkém počtu, telefonní čísla, měny a dokonce i procenta jsou krásně zobrazeny v dialogovém okně.

var num \u003d 714000.80;

výstraha (num.tolocalestring ());

Pracovat s prvky typového čísla, celého globálního objektu s bandou všech druhů matematických funkcí, jejichž jméno Matematika..

Kromě toho existují i \u200b\u200bjiné metody, které provádějí zaokrouhlování číselných hodnot na celá čísla, až desetiny, setiny atd. Zvažte je všechny další.

Skvělá a mocná matematika

Globální matematický objekt obsahuje obrovské množství různých matematických a trigonometrických funkcí. Jedná se o velmi potřebný objekt a často rozřezává vývojáře při práci s digitálními daty.

Na jiných platformách existují analogie matematika. Například v populárních jazycích, jako je Java a C #, matematika je třída, která podporuje všechny stejné standardní funkce. Takže, jak vidíte tento nástroj je opravdu skvělý a mocný.

Teď chci projít specifickými metodami zodpovědnými za zaokrouhlování a informovat o nich podrobně.

Math.Floor ()

Začnu S. Matematika.podlaha. Věnujte pozornost názvu metody. To je logicky jasné, že od té doby, co mluvíme o zaokrouhlení a doslovný překlad slova "podlahy" znamená "podlahu", pak tento nástroj zaokrouhluje zpracované hodnoty do menšího rovného.

Možnost je také možné, když zpracované číslo používající tuto funkci zůstane stejný. Vše proto, že zaokrouhlení se provádí na neurální nerovnost (<=). Таким образом, при отработке этой строчки кода:

alert (math.floor (4.5));

odpověď bude číslo 4.

Math.ceil ()

Znovu se podívejte na název (v takovém způsobu, materiál se rychle absorbuje). Pokud někdo neví, znamená "strop". To znamená, že zaokrouhlení Číselné údaje budou prováděny na nejvíce, s použitím nepřijatosti (\u003e \u003d).

alert (math.ceil (4.5));

Jak jste již hádali, odpověď bude číslo 5.

Math.round ()

Tato metoda se objeví frakční číslo na nejbližší celek. Takže, pokud je zlomková část v rozsahu od 0 do 0,5 ne inkluzivní, zaokrouhlení dochází k menší hodnotě. A pokud je zlomková část v rozsahu od inkluzivní 0,5 a do příštího celého čísla, je zaokrouhleno na větší celek.

alert (math.round (4.5));

Doufám, že všichni si mysleli nebo řekli správnou odpověď - 5.

Některé další metody

JavaScript má také další 2 metody, které se zabývají zaoblení numerických reprezentací. Jsou však poněkud odlišné.

Bude to o takových nástrojích jako tofixed () a toprecision (). Odpovídají nejen za zaokrouhlování, ale pro jeho přesnost určitým znakům. Bojme se hlouběji.

tofixed ()

S tímto mechanismem můžete určit, kolik příznaků po čárku potřebují zaokrouhlit hodnotu. Metoda vrátí výsledek jako řetězec. Níže jsem připojil možnost se třemi různými možnostmi. Analyzujte přijaté odpovědi.

var num \u003d 5656.9393;

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

dokument.writeln (num.tofixed (2)); // 5656.94.

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

Jak je vidět, pokud nezadáte argument, pak tofixed ()) zaokrouhlá frakční hodnota do celku čísla. Ve třetím řádku dokončena zaokrouhlení až 2 znakya ve čtvrtém - kvůli parametru "7", tři další 0 bylo řešeno.

toprecision ()

Tato metoda působí poněkud odlišně. Na místě argumentu můžete ponechat jak prázdné místo a nastavit parametr. Latter však bude zaokrouhlit čísla před zadaným počtem čísel, nevěnuje pozornost čárku. Zde jsou výsledky programu přepsány z minulosti příkladu:

var num \u003d 5656.9393;

dokument.writeln (num.toprecision ()); // 5656.9393.

document.Writeln (num.toprecision (2)); // 5.7E + 3

document.Writeln (Num.topreceision (7)); // 5656.939.

Soubor divize na 0 v JS

Jak je známo z lekcí v matematice, není možné rozdělit na nulu. Toto pravidlo vzalo jako základ většinu tvůrců programovacích jazyků. Proto při dělení na nulu, všechny programy dávají chybu.

Javascript se však zde rozlišoval. Takže během provádění takové operace nejsou žádné chybové zprávy ... Protože taková operace se vrací "Nekonečno"!

Proč? Jak je známo ze stejných matematických věd, tím menší je dělič, výsledkem je větší počet. Proto se tvůrci tohoto prototypově orientovaného jazyka rozhodli opustit šablony a jít vlastní cestou.

Pro ty, kteří jsou poprvé čelili hodnotě nekonečna, vysvětlil jsem své rysy.

Infinity - znamená nekonečno a plně odpovídá matematickému znamení ∞.

Může být negativní. Všechny standardní pravidla pro práci s aritmetickými operátory jsou také uložena.

výstraha (12/0); // nekonečno

výstraha (12.34 / 0); // nekonečno

výstraha (-3 / 0); //--infinity.

Na tom, možná a dokončit. Pokud se vám líbí publikace, pak se ujistěte, že se přihlásíte do mého blogu. Nenechávejte odkaz na zajímavé články a sdílejte je s přáteli. Ahoj!



JavaScript-matematika, zaokrouhlení až po dvě desetinná místa (9)

Mám následující JavaScript Syntaxe:

Var Sleva \u003d math.round (100 - (cena / listPrice) * 100);

To je zaokrouhleno na celé číslo. Jak mohu vrátit výsledek dvě desetinné značky?

Zde je pracovní příklad

VAR hodnota \u003d 200.2365455; Výsledek \u003d math.round (hodnota * 100) / 100 // Výsledek bude 200.24

Pro zpracování zaokrouhlování na libovolný počet desetinných míst pro většinu potřeb bude dostatek funkce s 2 kódovými řádky. Zde je příklad kódu hry.

Var testnum \u003d 134.9567654; Var decpl \u003d 2; var tarteres \u003d rounddec (testnum, decpl); Alert (Testnum + "zaokrouhleno na" + decpl + "desetinná místa je" + testres); Funkce RoundDec (NBR, DEC_PLACES) (var mult \u003d math.pow (10, dec_places); vrátit math.round (nbr * multifunkční) / multi;)

Nejlepší a jednoduché řešení, které jsem našel, je

Funkční kolo (Návratové číslo (math.round (hodnota + E "+ desetinná místa) +" E - "+ desetinná místa);) kulaté (1.005, 2); // 1.01.

Malá variace přijaté odpovědi. Tofixed (2) vrátí řetězec a vždy dostanete dvě desetinné známky. To může být nuly. Pokud chcete potlačit finální nulu (y), prostě to udělat:

Var Sleva \u003d + ((cena / listprice) .tofixed (2));

Upraveno: Zjistil jsem, že se zdá, že se zdá, že chyba ve Firefoxu 35.0.1, což znamená, že výše uvedené mohou dát NAN některé hodnoty.
Změnil jsem kód

Var sleva \u003d math.round (cena / listPrice * 100) / 100;

To dává číslo s přesností dvou desetinných míst. Pokud potřebujete tři, vynásobíte a rozdělí 1000, a tak dále.
Op chce vždy dva desetinné výtok, ale pokud je tofixed () zlomeno ve Firefoxu, musíte ji nejprve opravit.
Podívejte se na https://bugzilla.mozilla.org/show_bug.cgi?id\u003d1134388.

Chcete-li získat výsledek se dvěma desetinnými známkami, můžete provést následující:

Var Sleva \u003d math.round ((100 - (cena / listPrice) * 100) * 100) / 100;

Hodnota, která musí být zaoblena, je vynásobena 100 pro uložení prvních dvou číslic, pak se rozdělíme na 100, abychom získali skutečný výsledek.

Myslím, že nejlepší způsob, jak jsem viděl, je vynásoben 10 za počet čísel, pak dělat math.round a pak konečně rozdělit 10 podle počtu čísel. Zde je jednoduchá funkce, kterou používám v psacích textech:

Funkce Roundtoxdigits (hodnota: číslo, číslice: číslo) (hodnota \u003d hodnota * math.Pow (10, číslice); hodnota \u003d math.round (hodnota); hodnota \u003d hodnota / math.Pow (10, číslice); návratová hodnota; )

Nebo jednoduchý javascript:

Funkce Roundtoxdigits (hodnota, číslice) (pokud (! Číslice) (číslice \u003d 2;) hodnota \u003d hodnota * math.Pow (10, číslice); hodnota \u003d math.round (hodnota); hodnota \u003d hodnota / math.Pow (10 , číslice); návratová hodnota;)

POZNÁMKA. - viz Úpravy 4, pokud je důležitá 3místná přesnost.

Var Sleva \u003d (cena / listprice) .tofixed (2);

tofixed je zaokrouhleno nahoru nebo dolů pro vás v závislosti na hodnotách přesahujících 2 desetinné znaky.

Změna. Jak je uvedeno jinými, to převádí výsledek v řetězci. Chcete-li se tomu vyhnout:

Var Sleva \u003d + ((cena / listprice) .tofixed (2));

Editace 2. - Jak je uvedeno v připomínkách, tato funkce není prováděna s určitou přesností, například v případě 1,005 se vrátí 1,00 místo 1,01. Je-li v takovém rozsahu důležitá přesnost, zjistil jsem, že tato odpověď: HTTPS: //.com/A/32605063/1726511 to, co se zdá pracovat dobře se všemi testy, které jsem se snažil.

Jedna drobná modifikace vyžaduje, ale reakce uvedená výše vrací celá čísla, když je zaokrouhlena na jeden, proto, například 99.004 se vrátí 99 místo 99.00, což není ideální pro zobrazení cen.

Upravit 3. - Zdá se, že tofixed na skutečném návratu stále zkroucených čísel, je to finální úpravy práce. Geez tolik reparací!

Var sleva \u003d kolo (cena / listPrice), 2); FUNKCE KREADTO (n, číslice) (pokud (číslice \u003d\u003d\u003d undefined) (číslice \u003d 0;) var multiplicator \u003d math.pow (10, číslice); n \u003d parsefloat ((n * multiplikátor) .tofixed (11)); var test \u003d (math.round (n) / multiplicator); návrat + (test.tofixed (číslice));)

EDIT 4. "Zabiješ mě." Edit 3 se nezdaří na negativních číslech, bez kopání, proč je snazší jednoduše učinit záporné číslo pozitivní před zahájením zaokrouhlení, a pak ji vrátit zpět před vrácením výsledku.

Funkce RoundTo (n, číslice) (var negate \u003d false; pokud (číslice \u003d\u003d\u003d undefined) (číslice \u003d 0;), pokud (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; }

Nejrychlejším způsobem - rychlejší než tofixed ():

Dva decaliles

x \u003d .123456 výsledek \u003d math.round (x * 100) / 100 // výsledek .12

Tři deciznost

X \u003d .123456 výsledek \u003d math.round (x * 1000) / 1000 // výsledek .123

Funkční kolo (Num \u003d Math.Round (Num \u003d Math.Round (Num + E "+ DEC) Návratové číslo (Num +" E - "+ DEC)) // kolo na desetinné číslo vašeho výběru: kolo (1.3453.2)

Ahoj. Dnes, v sloupci JavaScriptu se podíváme na to, jak nastavit na JavaScriptu počet mořských poboček v číslech plovoucích bodů. Například musíte při zobrazení opustit 3 desetinné znaménko, nebo pouze dva.

Úkol: JavaScript číslo středníků

Takže jsme konfrontováni s úkolem: Existuje výsledek výpočtů, ve kterých je před středníkem a po čárce. Desetinný. Předpokládejme, že výsledek ukázal tento 1538.9891200153. Ale když by měl být výstup číslo odrážející částku, kde množství bankovek je až do čárky a po - kopecks.

Existuje několik způsobů, jak tento úkol vyřešit.

Řešení 1: JavaScript číslo středníků s metodou čerpání

tofixed je vložený do metody JavaScript, který je aplikován na libovolné číslo, přesnost má přesnost zaokrouhlení (tj. Počet pozemních znaků).

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;

Parametr přesnosti v této funkci by měl být alespoň 0 (nebere negativní hodnoty), a ne více než 20.

Můžete také udělat bez proměnné, například takto:

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

Řešení 2: JavaScript číslo středníků s metodou toprecision

Toto řešení je založeno na stejné vestavěné metodě JavaScriptu. Výrazným znakem této metody je, že parametr přijatý ke vstupu označuje, že není přesnost (počet středníků), ale celkový počet znaků (jak na čárku a po něm).

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

Řešení bez značek po čárku: JavaScript číslo středníků

Pokud musí být desetinné známky zcela složené, to znamená, že je nutné zaokrouhlit frakční číslo celku, pak můžete použít funkce matematiky: kulaté, stropy a podlahy.
Kolo - kola ve velké nebo menší straně (v závislosti na čísle). Pokud je hodnota poté, co je středníky více než polovina, pak kola na celou stranu, pokud je menší - menší. To znamená, že je-li 0,51 - bude 1, je-li 0,49 - 0.

Stree - z angličtiny. Strop je vždy zaokrouhlen do největší strany.

Patro - z angličtiny. Paul kolo vždy v menší straně.

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

To je vše. Doufám, že vám tato poznámka pomohla vyřešit úkol. Pokud se něco nezdařilo - klást otázky pomocí zeleného tlačítka "Zeptejte se na otázku specialista" nebo v komentářích.

Často výpočty poskytují výsledky, které neodpovídají limitům požadovaných rozsahů. V důsledku toho musíte cvičit JavaScript zaokrouhlení až určité hodnoty.

Proč kulatá čísla?

JavaScript neukládá celá čísla, protože jejich hodnoty jsou prezentovány ve formě čísel s plovoucí desetinnou čárkou. Mnoho frakcí nemůže být reprezentováno číslem s určitým konečným počtem středníků, takže JavaScript může generovat výsledky, stejně jako následující:

0.1 * 0.2; > 0.020000000000000004

V praxi nebude mít žádný význam, protože jde o chybu ve 2 Quinylonne. To však může ovlivnit výsledek při práci s čísly, které představují hodnoty ventilů, procenta nebo velikost souboru. Proto musíte udělat nebo až do určité desetinné znaménko.

Zaokrouhlení desetinná čísla

Pro "Trim" desetinné číslo se používají metody shofixed () nebo toprecision (). Oba berou jeden argument, který určuje počet významných a značek po čárku, která musí být zahrnuta do výsledku:

  • pokud pro tofixed () není definován argument, výchozí hodnota je 0, tedy žádné známky po čárce; Maximální hodnota argumentu je 20;
  • pokud pro toprecision () není uveden argument, počet se nezmění.

var randnum \u003d 6,25; randnum.tofixed (); \u003e "6" math.pi.toprecision (1); \u003e "3" var randnum \u003d 87.335; Randnum.tofixed (2); \u003e "87.33" var randnum \u003d 87.337; Randnum.topreceision (3); \u003e "87.3"

Poznámka

A tofixed () a toprecision vrátí zaoblené malá reprezentace, a ne číslo. To znamená, že přidání rozhodnutého do Randnum bude mít za následek řetězec concontine a ne jedno číslo:

console.log (randnum + zaoblené); \u003e "6.256"

Pokud potřebujete získat zaokrouhlení javascriptu na setiny, použijte parsefloat ():

var randnum \u003d 6,25; var zaoblené \u003d parsefloat (randnum.tofixed (1)); Console.log (zaoblené); \u003e 6.3.

tofixed () a toprecision () jsou také užitečné metody zkrácení velkého počtu středníků. Je vhodné při práci s čísly představujícími měnové jednotky:

var wholenu \u003d 1 var dolarů \u003d wholenuum.tofixed (2); Console.log (dolary); \u003e "1.00"

Vezměte prosím na vědomí, že pokud existuje více známek než specifikovaný parametr přesnosti, toprecision vydá výsledek v vědeckém formátu:

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

Jak se vyhnout chybám při zaokrouhlení desetinných frakcí

V některých případech se provádí čerpání a toprecision JavaScript zaokrouhlení 5 na menší stranu, ne až více:

var nitest \u003d 1,005; numtest.tofixed (2); \u003e 1;

Výsledek výše uvedeného příkladu by měl být 1,01 a ne 1. Pokud chcete vyhnout této chybě, doporučuji používat exponenciální čísla:

funkční kolo (Návratové číslo (Math.Round (hodnota + E "+ desetinná místa) +" E - "+ desetinná místa);)

Aplikace:

kolo (1.005.2); \u003e 1.01.

Pokud potřebujete ještě spolehlivější řešení než zaokrouhlení, je k dispozici Mdn..

Zaokrouhlení s epsilonem

Alternativní metoda Javascript zaokrouhlení až desetin byl představen v ES6 ( také známý jako JavaScript 2015). « Stroj Epsilon.»Poskytuje rozumný chybový limit při porovnání dvou plovoucích středníků. Bez zaokrouhlení mohou porovnání poskytovat výsledky jako následovně:

0,1 + 0,2 \u003d\u003d\u003d 0.3\u003e False

Math.Epsilon lze použít ve funkci pro získání správného srovnání:

funkce Epect (X, Y) (vrátit math.abs (X - Y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }

Funkce trvá dva argumenty: Jeden obsahuje výpočty, druhý očekávaný (zaoblený) výsledek. Vrátí porovnání těchto dvou parametrů:

epect (0,1 + 0,2, 0,3)\u003e Pravda

Všechny moderní prohlížeče podporují matematické funkce ES6. Pokud však potřebujete poskytovat podporu ve starých prohlížečích, musíte použít Polyfilla.

Zkrácení desetinných čísel

Všechny metody prezentované dřívější provést Javascript zaokrouhlení až desetin. Chcete-li ořídit kladné množství až dvou míst po čárku, vynásobte ji 100, žlabu znovu, a pak získaný výsledek je rozdělen 100, potřebujete:

funkce zkrácená (num) (vrátit math.trunc (num * 100) / 100;) zkrácené (3.1416)\u003e 3.14

Pokud je požadováno něco flexibilního, můžete použít rozbitý operátor:

funkce zkrácená (var numpowerconverter \u003d math.pow (10, decimalplaces); návrat ~ ~ (num * numpowerconverter) / numpowerconverter;)

Použitím:

var randint \u003d 35.874993; Zkrácený (Randint, 3); \u003e 35.874.

Zaokrouhlení na nejbližší číslo

Provádět JavaScript zaokrouhlení do celku, Math.round () se používá:

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

Všimněte si, že " poloviční hodnoty", Jako je .5, zaokrouhleno nahoru.

Zaokrouhlení na nejbližší celé číslo

Pokud chcete zaokrouhlit v menší straně, použijte metodu Math.Floor ():

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

Zaokrouhlení "Down" má jeden směr pro všechna čísla, včetně negativního. To může být reprezentováno jako mrakodrap s nekonečným počtem podlah, včetně pod nadační úrovní ( představující záporná čísla). Pokud jste ve výtahu mezi suterénu 2 a 3 ( co odpovídá hodnotě -2.5), Math.Floor vám dodá do podlahy -3:

Math.floor (-2,5); \u003e -3.

Pokud se vám chcete vyhnout, použijte javascript matematika zaokrouhlení pomocí matematiky () podporované ve všech moderních prohlížečích (s výjimkou) Tj. Okraj.):

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

MDN také poskytuje polyfill ze tří řádků pro poskytování math.trunc podporu ve starých prohlížečích a tj..

Zaokrouhlení do nejbližšího celého čísla

Pokud chcete zaokrouhlit desetinná čísla, použijte math.ceil. Akce tohoto způsobu může být také reprezentována jako nekonečný výtah: math.ceil je vždy šťastný "nahoru", bez ohledu na to, zda je číslo negativní nebo pozitivní:

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

Zaokrouhlení na nejbližší vícečetné číslo

Pokud potřebujete zaokrouhlit hodnotu na nejbližší číslo, více 5, vytvořte funkci, která rozděluje číslo na 5, zaokrouhluje ji a potom vynásobí výsledek na stejnou hodnotu:

funkce Klopto5 (Num) (Návrat matematika (Num / 5) * 5;)

Použitím:

kulaté (11); \u003e 10.

Pokud chcete provést JavaScript zaokrouhlení až na dva znaky, můžete přenášet funkce jako počáteční číslo a multiplicita:

fUNKCE ROOKTOMULTING (NUM, Multiple) (Return Math.Round (Num / Multiple) * Multiple;)

Chcete-li použít funkci, zapněte zaoblený počet a multiplicitu v jeho volání:

var iniciální délka \u003d 11; var násobí \u003d 10; Runttomliple (inicialnumber, vícenásobný); \u003e 10;

Pro zaokrouhlení hodnot pouze ve velkém nebo menším směru, vyměňte v kole funkce na stropu nebo podlaze.

Vazba na rozsah

Někdy potřebujete získat hodnotu x, která by měla být v určitém rozsahu. Například potřebujete hodnotu od 1 do 100, ale dostaneme hodnotu 123. Chcete-li ji opravit, můžete použít min () () () () vrátí nejmenší čísla) a max (max ( vrátí maximální přípustné číslo).

Použitím:

vAR Lowbound \u003d 1; var highbound \u003d 100; var numinput \u003d 123; var upevnil \u003d math.max (lowbound, math.min (numinput, highbound); Console.log (upnuté); \u003e 100;

Můžete vytvořit funkci nebo číslo třídy rozšíření.

Velmi často výpočty v JavaScriptu dávají docela výsledky, které chceme. Samozřejmě, můžeme dělat s čísly cokoliv - zaokrouhlení ve velké nebo menší straně, nastavit rozsahy, odříznout zbytečné čísla na určitý počet desetinných míst, to vše záleží na tom, co chcete dělat v budoucnu s tímto číslem.

Proč potřebujete zaokrouhlování?

Jedním z zvědavých aspektů JavaScriptu je, že vlastně neukládá celá čísla, okamžitě pracujeme s čísly plovoucí bodu. To v kombinaci se skutečností, že mnoho zlomkových hodnot nemůže být vyjádřeno konečným počtem desetinných známek, můžeme získat takové výsledky v JavaScriptu:

0.1 * 0.2; > 0.020000000000000004 0.3 - 0.1 > 0.19999999999999998
Pro praktické účely tato nepřesnost nezáleží na tom, v našem případě mluvíme o chybě v Quintillion dolarů, nicméně, někdo může zklamat. Můžeme dostat mírně podivný výsledek a při práci s čísly, které jsou hodnoty ventilů, procenta nebo velikosti souborů. Aby bylo možné tyto nepřesnosti opravit, musíme být schopni zaokrouhlit výsledky, zatímco stačí navázat desetinnou přesnost.

Zaokrouhlování čísel má praktickou aplikaci, můžeme například manipulovat s číslem v určitém rozsahu, například chceme zaokrouhlit hodnotu na nejbližší celé číslo, a ne pracovat pouze s desetinnou částí.

Zaokrouhlení desetinná čísla

Aby bylo možné odříznout desetinné číslo, použijte metodu shofixed nebo toprecision. Oba jsou pořízeny jediným argumentem, který určuje, jakož mnozí smysluplná čísla (tj. Celkový počet čísel používaných mezi číslem) nebo po středotěsně (množství po desetinná bodu) by měl obsahovat výsledek:
  1. Pokud argument není definován pro tofixed (), pak ve výchozím nastavení bude nulová, což znamená 0 \u200b\u200bznaček po čárku, argument má maximální hodnotu rovnou 20.
  2. Pokud argument není určen pro toprecision, zůstane číslo nedotčený
Nechť Randnum \u003d 6,25; randnum.tofixed (); \u003e "6" math.pi.toprecision (1); \u003e "3" randnum \u003d 87.335; Randnum.tofixed (2); \u003e "87.33" Randnum \u003d 87.337; Randnum.topreceision (3); \u003e "87.3"
Metody čerpání () a Toprecision () a Toprecision ()) Vrátí strunový reprezentaci výsledku, nikoli číslo. To znamená, že při sčítání zaoblené hodnoty s Randnum budou řádky zřetězeny, a nikoli množství čísel:

Nechť Randnum \u003d 6,25; Nechte zaoblené \u003d randnum.tofixed (); // "6" konzoly.log (randnum + zaoblené); \u003e "6.256"
Pokud chcete, aby výsledek měl numerický typ dat, budete muset použít parysoftoot:

Nechť Randnum \u003d 6,25; Nechte zaoblené \u003d parsefloat (randnum.tofixed (1)); Console.log (zaoblené); \u003e 6.3.
Upozorňujeme, že 5 hodnot jsou zaokrouhleny s výjimkou vzácných případů.

Metody shofixed () a toprecision () metody jsou užitečné, protože mohou nejen odříznout zlomkovou část, ale také doplňovat značky po čárku, což je vhodné při práci s měnou:

Nechte Wholenuum \u003d 1 nechat dolary \u003d wholenuum.tofixed (2); Console.log (dolary); \u003e "1.00"
Podmínka Všimněte si, že toprecision poskytne výsledek do exponenciálního záznamu, pokud je počet celých čísel větší než samotná přesnost:

Nechte num \u003d 123,435 num.topreciision (2); \u003e "1.2E + 2"

Jak se vyhnout zaokrouhlování chyb s desetinnými čísly

V některých případech, tofixed a toprecision zaokrouhluje hodnotu 5 na menší stranu a ve velkém:

Nechte numtest \u003d 1,005; numtest.tofixed (2); \u003e "1.00"
Výsledkem výše uvedeného výpočtu bylo 1,01, a ne 1. Pokud chcete vyhnout podobné chybě, můžeme použít řešení navržené Jack L Moore, který používá exponenciální čísla pro výpočet:

Funkční kolo (Návratové číslo (Math.Round (hodnota + E "+ desetinná místa) +" E - "+ desetinná místa);)
Nyní:

Kolo (1.005.2); \u003e 1.01.
Pokud chcete spolehlivější řešení, než je uvedeno výše, můžete jít do MDN.

Stroj Epsilon zaokrouhlení

Do ES6 byla zavedena alternativní metoda zaokrouhlení desetinných čísel. Stroj Epsilon zaokrouhlení poskytuje rozumný chybový limit při porovnání dvou čísel plovoucích bodů. Bez zaokrouhlení mohou porovnání poskytovat výsledky jako následovně:

0,1 + 0,2 \u003d\u003d\u003d 0.3\u003e False
Math.Epsilon používáme v naší funkci, abychom získali správné srovnání:

Funkce Epect (X, Y) (vrátit math.abs (X - Y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
Funkce trvá dva argumenty: první aktuální výpočet, druhý je očekávaný výsledek. Vrátí porovnání dvou:

Epect (0,1 + 0,2, 0,3)\u003e Pravda
Všechny moderní prohlížeče již podporují matematické funkce ES6, ale pokud chcete získat podporu v prohlížečích, jako je například 11, používat polyfills.

Řezání frakční části

Všechny výše uvedené metody jsou schopny zaokrouhlit až desetinná čísla. Aby bylo možné jednoduše odříznout číslo až do dvou značek po čárku, musíte ji nejprve vynásobit o 100, a pak získaný výsledek je již rozdělen 100:

Funkce zkrácená (num) (vrátit math.trunc (num * 100) / 100;) zkrácené (3.1416)\u003e 3.14
Pokud chcete upravit metodu pro libovolný počet středníků, můžete použít dvojitou bitty popření:

Funkce zkrácená (nechat numpowerconverter \u003d math.Pow (10, decimalply); návrat ~ ~ (numpowerconverter) / numpowerconverter;)
Nyní:

Nechť randint \u003d 35.874993; Zkrácený (Randint, 3); \u003e 35.874.

Zaokrouhlení na nejbližší číslo

Aby bylo možné zaokrouhlit desetinné číslo na nejbližší číslo ve více nebo v menší straně, v závislosti na tom, co jsme nejblíže, používejte math.round ():

Math.round (4.3)\u003e 4 math.round (4.5)\u003e 5
Upozorňujeme, že "polovina hodnoty", 0,5 je zaokrouhlena ve velkém směru podle pravidel matematiky.

Zaokrouhlení na menší k nejbližšímu celému číslu

Pokud chcete vždy zaokrouhlit na menší stranu, použijte math.floor:

Math.Floor (42.23); \u003e 42 Math.Floor (36.93); \u003e 36.
Upozorňujeme, že zaokrouhlování v menší straně funguje pro všechna čísla, včetně negativního. Představte si mrakodrap s nekonečným počtem podlah, včetně nízkoúrovňových podlah (představující záporná čísla). Pokud jste ve výtahu na nižší úrovni mezi 2 a 3 (což je hodnota -2.5), Math.Floor vám poskytne do -3:

Math.floor (-2,5); \u003e -3.
Ale pokud se chcete vyhnout podobné situaci, použijte math.trunc, podporovaný ve všech moderních prohlížečích (s výjimkou IE / Edge):

Math.trunc (-41.43); \u003e -41.
Polyfill na MDN najdete, abyste poskytli podporu Math.Trunc v prohlížečích a tj.

Zaokrouhlení na nejbližší celé číslo

Na druhou stranu, pokud budete vždy muset zaokrouhlit do největšího, použijte math.ceil. Zapomeňte si, že nekonečný výtah: Math.Ceil bude vždy jít nahoru, bez ohledu na to, zda je číslo záporné nebo ne:

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

Zaokrouhlení na větší / menší číslo

Pokud chceme zaokrouhlit až k nejbližšímu číslu, více 5, nejjednodušší způsob, jak vytvořit funkci, která rozděluje číslo na 5 kolech, a pak nás vynásobí na stejnou částku:

Funkce Klopto5 (Num) (Návrat matematika (Num / 5) * 5;)
Nyní:

Kulaté (11); \u003e 10.
Chcete-li zaokrouhlit až na více vaší hodnoty, použijeme obecnější funkci tím, že procházíte počáteční hodnotou a násobkem:

FUNKCE ROOKTOMULTING (NUM, Multiple) (Return Math.Round (Num / Multiple) * Multiple;)
Nyní:

Nechat iniciativum \u003d 11; Nechte více \u003d 10; Runttomliple (inicialnumber, vícenásobný); \u003e 10;

Upevnění čísla v rozsahu

Existuje mnoho případů, kdy chceme dostat hodnotu x ležící v dosahu. Můžeme například potřebovat hodnotu od 1 do 100, ale zároveň jsme obdrželi hodnotu 123. Aby bylo možné opravit, můžeme použít minimum (vrátí nejmenší počet čísel) a maximum ( Vrátí největší z více čísel). V našem příkladu rozsah od 1 do 100:

Nechte Lowbound \u003d 1; Pustit highbitound \u003d 100; Nechť numinput \u003d 123; Nechť upnout \u003d math.max (Lowbound, math.min (numinput, highbound); Console.log (upnuté); \u003e 100;
Opět můžeme znovu použít operaci a zabalit vše do funkce, používáme řešení navržené Daniel X. Moore:

Číslo
Nyní:

Numinput.clamp (lowbound, highbound); \u003e 100;

Gaussovský zaokrouhlení

Gaussovský zaokrouhlení, také známý jako bankovní zaokrouhlení, je to, že zaokrouhlení pro tento účel dochází k nejbližšímu černému. Tato metoda zaokrouhlení funguje bez statistické chyby. Nejlepší řešení bylo navrženo časem Time:

Funkce Gaussround (Nechť D \u003d Decimalply || 0, m \u003d math.Pow (10, d), n \u003d + (d? Num * m: num) .tofixed (8), i \u003d math.floor (n), f \u003d n - i, e \u003d 1E-8, r \u003d (f\u003e 0,5 - E &&< 0.5 + e) ? ((i % 2 == 0) ? i: i + 1) : Math.round(n); return d ? r / m: r; }
Nyní:

Gaussround (2.5)\u003e 2 Gaussround (3.5)\u003e 4 Gaussround (2.57,1)\u003e 2.6
Desetinné znamení v CSS:

Vzhledem k tomu, že JavaScript je často používán k vytvoření poziční konverze HTML prvků, můžete se divit, co se stane, když vytvoříme desetinné hodnoty pro naše položky:

#Box (šířka: 63.667731993px;)
Dobrou zprávou je, že moderní prohlížeče budou v úvahu desetinné hodnoty v bloku modelu, včetně v procentech nebo pixelových jednotkách měření.

Třídění

Velmi často musíme řadit všechny prvky, například máme řadu herních záznamů, zatímco oni by měli být organizováni jako sestupný řád hráčů. Bohužel, standardní metoda Sort () má některá úžasná omezení: funguje dobře s často používanými anglickými slovy, ale okamžitě se rozbije na setkání s čísly, jedinečné postavy nebo slova v velkých písmenech.

Seřadit v abecedním pořadí

Zdá se, že třídění pole abecedně by mělo být nejjednodušší úkol:

Nechť ovoce \u003d ["Ořech Squash", "meruňka", "cantaloupe"]; ovoce.sort (); \u003e "Meruňka", "Ořech Squash", "Cantaloupe"]
Jsme však konfrontováni s problémem, jakmile je jeden z prvků v velkých písmenech:

Nechte ovoce \u003d ["Ořech Squash", "Aprot", "cantalope"]; ovoce.sort (); \u003e "CANTALOUPE", "Aprot", "Ořech Squash"]
Důvodem je skutečnost, že ve výchozím nastavení sorter porovnává první symbol uvedený v Unicode. Unicode je jedinečný kód pro libovolný symbol, bez ohledu na platformu, bez ohledu na program bez ohledu na jazyk. Například, pokud se podíváte přes kódovou tabulku, znak "A" je U + 0061 (v hexadecimálním systému 0x61), zatímco symbol "C" má kód U + 0043 (0x43), který jde před tabulkou Unicode než symbol "A".

Chcete-li třídit pole, které mohou obsahovat smíšené registry prvních písmen, musíme buď převést všechny položky do dočasně do nižšího registru nebo určit svého pořadí třídění pomocí metody LocalCompare () s některými argumenty. Zpravidla, pro takový případ je lepší okamžitě vytvořit funkci pro opakované použití:

Funkce Alphasort (Arr) (Return A.localecompare (B, CS "(" Senzibilita ":" Base "));));) Nechte ovoce \u003d [" Ořech Squash "," meruňka "," mantaloupe "]; Alphasort (ovoce)\u003e
Pokud chcete získat pole seřazeno do reverzního abecedního pořadí, jednoduše změňte polohy A a B do funkce:

Funkce Alphasort (Arr) (Return B.localecompare (A, CS, CS "(" citlivost ":" Base "));));) Nechte ovoce \u003d [" Ořešterútní squash "," meruňka "," cantaloupe "]; Alphasort (ovoce)\u003e ["CANTALUPE", "OBLETERUT SQUASH", "ARPICOT"]
Stojí za to věnovat pozornost tomu, že LocalCompare je používán s argumenty, je stále nutné si uvědomit, že je podporován IE11 +, pro starší verze, můžeme ji používat bez argumentů a v nižším rejstříku:

Screcksort funkce (ARR) (Return A.ToLowercase (). LocalCompare (B.ToLowercase ());));) Nechte ovoce \u003d ["Ořeštec squash", "meruňka", "mantaloupe"]; Screcksort\u003e [Meruňka, "Ořech Squash", "Cantaloupe"]

Numerické třídění

To vše se nevztahuje na příklad, který jsme hovořili o výše uvedeném řetězci herních záznamů. S některými numerickými policemi, třídění funguje jen dokonale, ale v určitém okamžiku může být výsledek nepředvídatelný:

Nechte highscores \u003d; highscores.sort (); \u003e
Faktem je, že metoda Sort () vytváří lexikografické srovnání: a to znamená, že čísla budou převedena na řetězec a srovnání budou realizovány znovu mapováním prvního znaku tohoto řetězce v tabulce Unicode Symboly. Proto musíme určit pořadí řazení:

Nechte highscores \u003d; Highscores.sort (zpět a - b;)); \u003e
Opětovné třídění čísel v opačném pořadí, změnit polohy A a B do funkce.

Seřadit Json-jako struktura

A konečně, pokud máme strukturu dat jako JSON, reprezentovanou jako řadu herních záznamů:

Nechte skóre \u003d [("Jméno": "Daniel", "Skóre": 21768), ("Jméno": "Michael", "Skóre": 33579), ("Jméno": "Alison", "Skóre": 38395 )]];
V ES6 + můžete použít funkce šipky:

SCORES.SORT ((A, B) \u003d\u003e B.Score - A.Score);
Pro staré prohlížeče, kteří nemají takovou podporu:

SCORES.SORT (RETURN A.SCORE - B.Score);
Jak vidíte, třídění v JavaScriptu je docela zjevná věc, doufám, že tyto příklady budou snadné pro život.

Práce s napájecími funkcemi

Cvičení je operace, původně definovaná v důsledku více násobení přirozeného čísla na sobě, druhá odmocnina čísla A je číslo dané čtverce. S těmito funkcemi jsme mohli neustále užívat v každodenním životě v lekcích matematiky, včetně výpočtu oblastí, svazků nebo dokonce fyzického modelování.

V JavaScriptu je funkce napájení reprezentována jako math.Pow (), v novém standardu ES7 byl do té míry představen nový cvičební operátor - "* *".

V roce stupně

Aby bylo možné vybudovat číslo v N-Uy, použijte funkci math.pow (), kde první argument je číslo, které bude postaveno do určité míry, druhý argument je indikátorem stupně:

Math.Pow (3.2)\u003e 9
Taková forma záznamových prostředků 3 na čtverci nebo 3 × 3, což má za následek výsledek 9. Jiný příklad může být samozřejmě podáván:

Math.Pow (5.3); \u003e 125.
To znamená, že 5 na Kubě nebo 5 × 5 × 5, rovné 125.

ECMAScript 7 je v zásadě následující verzi JavaScriptu, můžeme použít nový navrhovaný provozovatel cvičení do stupně - * *, taková forma záznamu může být větší vizuální:

3 ** 2 > 9
V tuto chvíli je podpora tohoto operátora poměrně omezená, takže se nedoporučuje ji používat.

Výkonná funkce může být užitečná v různých situacích. Jednoduchý příklad, počítání počtu sekund za hodinu: math.Pow (60.2).

Čtvercový a kubický kořen

Math.SQRT () a math.cbrt () jsou naproti funkcím math.pow (). Jak si pamatujeme, druhá odmocnina čísla A je číslo, které dává, když je náměstí postaveno.

Math.SQRT (9)\u003e 3
Současně je kubický kořen čísla A číslo, které dává, když je krychle postavena.

Math.cbrt (125)\u003e 5
Math.cbrt () byl zaveden do specifikace JavaScriptu nedávno, a proto podporován pouze v moderních prohlížečích: Chrome 38+, Firefox a Opera 25+ a Safari 7.1+. Všimněte si, že v tomto seznamu chybí Internet Explorer, ale najdete polyfill na MDN.

Příklady

Samozřejmě můžeme použít a ne celé číslo v jednom z těchto funkcí:

Math.Pow (1,25, 2); \u003e 1.5625 math.cbrt (56.57)\u003e 3.8387991760286138
Upozorňujeme, že funguje docela dobře při použití negativních hodnot argumentů:

Math.Pow (-5.2)\u003e 25 Math.Pow (10, -2)\u003e 0.01
Pro druhou odmocninu však nebude fungovat:

Math.SQRT (-9)\u003e Nan
Z matematické analýzy víme, že pod imaginárním číslem chápou náměstí kořenů z negativních čísel. A to nás může vést k jiné techniky práce s komplexními čísly, ale to je další příběh.

Můžete použít zlomkové hodnoty v math.pow () najít čtvercové a kubické kořeny čísla. Square Root používá indikátor 0.5:

Math.Pow (5, 0,5); // \u003d math.sqrt (5) \u003d 5 ** (1/2)\u003e 2.23606797749979
Vzhledem k plovoucím bodu rozmary však nelze přesně předpokládat správný výsledek:

Math.Pow (2.23606797749979,2)\u003e 5.0000000000001
V takových situacích budete muset uchýlit k cut-off značky v číslech nebo zaokrouhlení na libovolnou hodnotu.

Některé, pro nepochopitelné důvody v JavaScriptu zaměňují funkci math.pow () s math.exp (), což je exponenciální funkce pro čísla jako celek. Poznámka: V angličtině je indikátor "exponent" přeložen jako "exponent", takže se spíše odkazuje na anglicky mluvící, i když existují alternativní názvy indikátorů, jako je index, napájení.

Matematické konstanty

Práce s matematikou v JavaScriptu je usnadněno řadou vestavěných konstant. Tyto konstanty jsou vlastnosti matematického objektu. Stojí za zmínku, že konstanty jsou napsány v horních případech, a nikoliv s velbloudí.

Math.abs, parseint, parsefloat

Práce s čísly v JavaScriptu může být mnohem složitější, než se zdá. Získané hodnoty ne vždy spadají do očekávaných rozsahů, někdy výsledek nemusí být vůbec to, co jsme očekávali.

Math.Abs \u200b\u200b()

Metoda math.abs () Vrátí absolutní hodnotu čísla, která nám připomíná stejnou matematickou funkci čísla A.

Nechte Newval \u003d -57.64; Math.abs (newval); \u003e 57.64.
Math.Abs \u200b\u200b(0) Vždy se vrátí nulu, ale pokud vložíte minus znamení před funkcí -math.abs (num) budeme vždy zápornou hodnotou.

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

parseint ()

Víme, že JavaScript chápe, že "15" je řetězec, a nikoli číslo a například při analýze vlastností CSS s JavaScriptem s jakoukoliv hodnotou z nepřipraveného pole, naše výsledky mohou být nepředvídatelné. Mohli bychom se dostat na vstupní linku reprezentovanou jako "17px" a pro nás to není vzácné. Otázkou je, jak převést tento řetězec ve skutečné hodnotě a používat jej v dalších výpočtech.

Syntaxe: Parseint (řetězec, Radix);

Funkce PARSEINT převádí první argument přenášený do druhu řetězce, interpretuje jej a vrátí celočíselnou hodnotu nebo hodnotu NAN. Výsledek (pokud není NAN) je celé číslo a představuje první argument (řetězec), který je považován za číslo v zadaném číselném systému (Radix). Například základna 10 označuje konverzi z desetinného čísla, 8 - Octal, 16 hexadecimální a tak dále. Pokud je základna větší než 10, pak písmena slouží k označení čísel více než 9. Například pro hexadecimální čísla (základna 16), písmena od A do F.

Zvažte příklad práce s vlastnostmi CSS, kde, konvenčně řečeno, můžeme získat takovou hodnotu:

Nechte elem \u003d dokument. Nechte Centerpoint \u003d window.getComputedStyle (elem) .Transformorigin; \u003e "454px 2087.19px"
Můžeme rozdělit hodnoty na mezerách:

Nechť centra \u003d centerpoint.Split (""); \u003e ["454px", "2087.19px"]
Nicméně, každý prvek je stále řetězec, můžeme se zbavit použití naší funkce:

Nechte centx \u003d parseint (centra, 10); \u003e 454 nechat center \u003d parseint (centra, 10); \u003e 2087.
Jak vidíte, určujeme číslo čísla, na které bude číslo převedeno, na které je tento parametr volitelný, ale doporučuje se jej použít, v případě, že nevíte, která řádek bude na vstup.

parsefloat ()

Z výše uvedeného příkladu si pravděpodobně všimnete, že parseint vyhodí zlomkovou část. V našem případě může parsefloat pracovat s čísly plovoucí body. Opět může být užitečné při analýze CSS a dalších úkolů, zejména při práci s plovoucím bodem v procentech.

Syntaxe: Parsefloat (String)

Nechť fp \u003d "33.333333%"; Console.log (parsefloat (fp)); \u003e 33.33333.
Vezměte prosím na vědomí, že v Syntaxe Parsefloat není žádný druhý argument.

Chápeme, že Parseint () a parsefloatoat () jsou velmi užitečné funkce, je důležité vzít v úvahu, že není nutné neuskutečnit bez chyb, takže je nutné zkontrolovat rozsah očekávaných hodnot a nakonec analyzovat výsledek zajistit, aby byly hodnoty správné.
Poslat anonymně