Števila v JavaScriptu predstavljata predvsem primitivna tipa number in bigint. Pri tej strani se osredotočamo na tip number in na razred Number, ki vsebuje lastnosti in metode za delo s števili. V sodobni kodi praviloma uporabljamo primitivne vrednosti tipa number, metode razreda Number pa kličemo neposredno na številskih vrednostih ali prek objekta Number.
Pomni: JavaScript ima danes dve vgrajeni številski primitivni vrsti: number in bigint. Tip number uporabljamo za običajna števila, tip bigint pa za zelo velika cela števila.
Osnovna pravila
- Tip
numberpredstavlja števila s plavajočo vejico po standardu IEEE 754. - JavaScript pri tipu
numberne loči med celimi in decimalnimi števili kot ločenima tipoma. - Za zelo velika cela števila uporabljamo tip
bigint. - V sodobni kodi za preverjanje posebnih vrednosti pogosto uporabljamo metode razreda
Number. - Pri izpisu števil v določeni obliki pogosto uporabljamo metode
toFixed(),toPrecision()intoExponential().
Primerjave
Osnovno o številih
Tip number je v JavaScriptu 64-bitno število s plavajočo vejico. To pomeni, da ista vrsta predstavlja cela in decimalna števila. Za zelo velika cela števila, ki presegajo varno območje tipa number, uporabljamo tip bigint.
Pripona n na koncu števila pomeni, da gre za vrednost tipa bigint, ki jo uporabljamo za zelo velika cela števila.
const celo = 25;
const decimalno = 3.14;
const zeloVeliko = 9007199254740993n;
Pomni: bigint uporabljamo samo za cela števila, zato zapis kot na primer 10.5n ni veljaven.
Pozor: V sodobni kodi ni priporočljivo mešati tipov number in bigint v istem aritmetičnem izrazu brez jasne pretvorbe.
Natančnost števil
Ker tip number temelji na številih s plavajočo vejico, določeni decimalni izračuni niso vedno povsem aritmetično natančni. Posebej znan primer je vsota 0.1 + 0.2.
<p>Računanje s plavajočo vejico ni vedno povsem natančno.</p>
<button type="button" onclick="decimalnoStevilo()">Izpiši rezultat</button>
<p id="primer1"></p>
<script>
function decimalnoStevilo() {
const x = 0.1 + 0.2;
document.getElementById("primer1").textContent = "0.1 + 0.2 = " + x;
}
</script>
Računanje s plavajočo vejico ni vedno povsem natančno.
Pri celih številih je pomembno tudi območje varnih vrednosti. Razred Number vsebuje lastnosti MAX_SAFE_INTEGER in MIN_SAFE_INTEGER, ki določata največje in najmanjše celo število, ki ga lahko tip number še varno predstavi brez izgube natančnosti.
Pomni: Kadar potrebujemo zelo velika cela števila brez izgube natančnosti, je praviloma primernejši tip bigint kot tip number.
Lastnosti razreda Number
Razred Number vsebuje uporabne konstante oziroma lastnosti, ki opisujejo meje in posebne vrednosti tipa number.
| Lastnost | Opis |
|---|---|
Number.MAX_VALUE |
Vrne največjo pozitivno končno vrednost tipa number. |
Number.MIN_VALUE |
Vrne najmanjšo pozitivno vrednost tipa number, večjo od nič. |
Number.MAX_SAFE_INTEGER |
Vrne največje varno celo število tipa number. |
Number.MIN_SAFE_INTEGER |
Vrne najmanjše varno celo število tipa number. |
Number.POSITIVE_INFINITY |
Predstavlja pozitivno neskončnost. |
Number.NEGATIVE_INFINITY |
Predstavlja negativno neskončnost. |
Number.NaN |
Predstavlja posebno vrednost NaN. |
Number.EPSILON |
Vrne najmanjšo razliko med 1 in naslednjo večjo predstavljivo vrednostjo. |
<p id="primer2"></p>
<script>
document.getElementById("primer2").innerHTML =
"MAX_VALUE: " + Number.MAX_VALUE + "<br>" +
"MAX_SAFE_INTEGER: " + Number.MAX_SAFE_INTEGER + "<br>" +
"EPSILON: " + Number.EPSILON;
</script>
Pretvorbe v števila
Za pretvorbo vrednosti v število uporabljamo funkcijo Number(). Za razčlenjevanje nizov pa pogosto uporabljamo Number.parseInt() in Number.parseFloat(). Pri parseInt() je priporočljivo navesti tudi osnovo, na primer 10 za desetiški zapis.
<p id="primer3"></p>
<script>
document.getElementById("primer3").innerHTML =
Number(true) + "<br>" +
Number("50") + "<br>" +
Number.parseInt("56.78", 10) + "<br>" +
Number.parseFloat("56.78");
</script>
Pozor: Funkcija Number() in metoda Number.parseInt() ne delujeta enako. Number("56.78") vrne decimalno število, Number.parseInt("56.78", 10) pa vrne samo celoštevilski del 56.
Preverjanje števil
V sodobni kodi za preverjanje pogosto uporabljamo metode Number.isNaN(), Number.isFinite(), Number.isInteger() in Number.isSafeInteger(). Te metode ne izvajajo enake vrste samodejnih pretvorb kot nekatere starejše globalne funkcije, zato so pogosto preglednejša izbira.
| Metoda | Opis |
|---|---|
Number.isNaN(vrednost) |
Vrne true, če je podana vrednost res posebna številska vrednost NaN, sicer pa vrne false. |
Number.isFinite(vrednost) |
Vrne true, če je podana vrednost končno število, torej ni Infinity, -Infinity ali NaN. |
Number.isInteger(vrednost) |
Vrne true, če je podana vrednost celo število tipa number. |
Number.isSafeInteger(vrednost) |
Vrne true, če je podana vrednost celo število, ki je znotraj območja varnih celih števil tipa number. |
<p id="primer4"></p>
<script>
document.getElementById("primer4").innerHTML =
Number.isNaN(NaN) + "<br>" +
Number.isFinite(25) + "<br>" +
Number.isInteger(25.0) + "<br>" +
Number.isSafeInteger(9007199254740991);
</script>
Pomni: Metoda Number.isSafeInteger() ne preverja samo, ali je vrednost celo število, ampak tudi, ali jo tip number še lahko natančno predstavi brez izgube celih enot.
Pozor: Globalna funkcija isNaN() pred preverjanjem najprej poskuša pretvoriti vrednost v število. Zaradi tega je v sodobni kodi pogosto primernejša metoda Number.isNaN(), ki preveri samo dejansko vrednost NaN.
Metode števila
Za oblikovanje izpisa števil pogosto uporabljamo metode toFixed(), toPrecision(), toExponential() in toString(). Pomembno je vedeti, da te metode pogosto vrnejo niz in ne več števila.
| Metoda | Opis |
|---|---|
toFixed(mesta) |
Vrne niz s številom, zaokroženim na podano število decimalnih mest. |
toPrecision(mesta) |
Vrne niz s številom, zapisanim na podano skupno število pomembnih mest. |
toExponential(mesta) |
Vrne niz z eksponentnim zapisom števila. |
toString(osnova) |
Vrne nizovno predstavitev števila, po potrebi tudi v drugi osnovi. |
valueOf() |
Vrne primitivno številsko vrednost. |
<p id="primer5"></p>
<script>
{
const x = 1.23456;
document.getElementById("primer5").innerHTML =
x.toFixed(2) + "<br>" +
x.toPrecision(4) + "<br>" +
x.toExponential(2) + "<br>" +
(255).toString(16);
}
</script>
Pomni: Metode toFixed(), toPrecision() in toExponential() vrnejo niz. Zato rezultat teh metod ni več število, ampak besedilna predstavitev števila.
Priporočila
- Za zelo velika cela števila uporabi
bigint, ne pa tipanumber. - Pri preverjanju posebnih vrednosti pogosto uporabi
Number.isNaN(),Number.isFinite()inNumber.isInteger(). - Pri
Number.parseInt()praviloma navedi tudi osnovo, na primer10. - Pri izpisu števil jasno loči med zaokroževanjem za prikaz in dejansko vrednostjo števila.
- Za običajno oblikovanje izpisa pogosto uporabi
toFixed()alitoPrecision().
Pogoste napake
- Tip
numberse razlaga, kot da je namenjen tudi poljubno velikim celim številom brez omejitev natančnosti. - Rezultat metod
toFixed()alitoPrecision()se obravnava kot število, čeprav metodi vrneta niz. - Globalna funkcija
isNaN()se uporablja brez razlage samodejne pretvorbe tipa, čeprav je v sodobni kodi pogosto primernejša metodaNumber.isNaN(). - Pri razčlenjevanju nizov se uporablja
parseInt()brez navedbe osnove, čeprav je izrecna osnova običajno preglednejša rešitev. - Napake pri plavajoči vejici se obravnavajo kot “napaka jezika”, namesto kot pričakovano lastnost predstavitve števil po standardu IEEE 754.