Načrtovanje in razvoj spletnih aplikacij

Razred Number

Š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 number predstavlja števila s plavajočo vejico po standardu IEEE 754.
  • JavaScript pri tipu number ne 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() in toExponential().

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 tipa number.
  • Pri preverjanju posebnih vrednosti pogosto uporabi Number.isNaN(), Number.isFinite() in Number.isInteger().
  • Pri Number.parseInt() praviloma navedi tudi osnovo, na primer 10.
  • Pri izpisu števil jasno loči med zaokroževanjem za prikaz in dejansko vrednostjo števila.
  • Za običajno oblikovanje izpisa pogosto uporabi toFixed() ali toPrecision().

Pogoste napake

  • Tip number se razlaga, kot da je namenjen tudi poljubno velikim celim številom brez omejitev natančnosti.
  • Rezultat metod toFixed() ali toPrecision() 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 metoda Number.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.