typeof x ===number
Het ene getaltype van JavaScript, voor gehele getallen én kommagetallen.
Zo bewaart JavaScript een getal
Wat is het
number is het primitieve type voor getallen. JavaScript kent geen apart type voor gehele getallen en kommagetallen: 42, -7, 3.14 en 1e6 zijn allemaal een number. Onder de motorkap is elk getal een 64-bits drijvendekommagetal volgens de standaard IEEE 754. Dat zie je hierboven: één bit voor het teken, elf voor de grootte, 52 voor de cijfers.
Naast gewone getallen kent number drie speciale waarden: Infinity, -Infinity en NaN (Not a Number, de uitkomst van een berekening die geen getal oplevert).
Waarom bestaat het
Elk programma rekent: prijzen, afstanden, tellers, percentages. JavaScript is ontworpen als eenvoudige taal voor de browser, en koos daarom voor één getaltype in plaats van een rij types (int, long, float, double) waartussen je moet kiezen en omzetten. Dat maakt beginnen makkelijk: je schrijft een getal en rekent ermee.
De prijs van die eenvoud is dat elk getal een benadering in binaire vorm is. Gehele getallen tot 253 − 1 zijn exact; veel kommagetallen, zoals 0.1, zijn dat niet. Wie dat weet, kan ermee omgaan. Wie het niet weet, krijgt rare bugs.
Hoe pas je het toe
Getallen schrijven
Notaties
Een getal kun je op zeven manieren in code schrijven. Ze leveren allemaal hetzelfde type op: een number. 0xff, 0o377, 0b11111111 en 255 zijn exact dezelfde waarde. Typ een getal en zie het in elke notatie. Kies een notatie voor de vijf W's: wat, waarom, wanneer, waar en wie.
42, 3.14, .5- Wat
- Gewone getallen met de cijfers 0–9 en een punt als decimaalteken.
.5en5.zijn verkorte vormen van0.5en5. - Waarom
- Zo schrijven mensen getallen; het is de standaard.
- Wanneer
- Bijna altijd: aantallen, prijzen in centen, maten. Schrijf
.5liever voluit als0.5, dat leest beter. - Waar
- Overal in code. JSON kent alleen decimaal en wetenschappelijk, en staat
.5en5.niet toe. - Wie
- Iedereen.
1e6, 2.5e-3- Wat
- Een getal maal een macht van 10.
2.5e-3is 2,5 × 10−3 = 0.0025.eenEmogen allebei. - Waarom
- Heel grote of heel kleine getallen zonder rij nullen, en dus zonder tikfouten.
- Wanneer
- Natuurkundige constanten, grenzen en tijden:
1e9nanoseconden,6.674e-11. JavaScript gebruikt het zelf bij het tonen van getallen vanaf 1021 en onder 10−6. - Waar
- Wetenschappelijke code, grafieken, simulaties, JSON uit API's en de console.
- Wie
- Data-analisten, wetenschappers, game-ontwikkelaars.
0xff- Wat
- Grondtal 16, met de cijfers 0–9 en a–f.
0xffis 255.0xen0Xmogen allebei. - Waarom
- Eén hexcijfer is precies 4 bits, twee hexcijfers zijn één byte. Zo zie je een bitpatroon in één oogopslag.
- Wanneer
- Kleuren (
0xff8800), bytes, Unicode-codepunten (0x1F600), hashes en bitmaskers. - Waar
- Canvas- en WebGL-kleuren, binaire bestandsformaten, netwerkprotocollen,
String.fromCodePoint. - Wie
- Front-end-ontwikkelaars (kleuren), systeem- en game-ontwikkelaars.
0o755- Wat
- Grondtal 8, met de cijfers 0–7.
0o17is 15. - Waarom
- Eén octaal cijfer is precies 3 bits. Dat past bij Unix-bestandsrechten: lezen, schrijven en uitvoeren voor eigenaar, groep en anderen.
- Wanneer
- Vrijwel alleen bij bestandsrechten:
0o755,0o644. - Waar
- Node.js:
fs.chmod('script.sh', 0o755),fs.mkdir(pad, { mode: 0o700 }). - Wie
- Back-end- en DevOps-ontwikkelaars.
0b1010- Wat
- Grondtal 2, met alleen 0 en 1.
0b1010is 10. - Waarom
- Het laat letterlijk zien welke bits aan staan.
- Wanneer
- Bitvlaggen en bitmaskers: rechten combineren met
|en testen met&. - Waar
- Spellen, protocollen, permissiesystemen, compressie. En bij leren hoe getallen werken, zoals in de bitweergave bovenaan.
- Wie
- Game- en systeemontwikkelaars, en iedereen die met bitoperatoren werkt.
1_000_000- Wat
- Een underscore tussen twee cijfers, die JavaScript negeert. Het werkt in elke notatie:
0b1111_0000,0xff_ff. - Waarom
- Leesbaarheid. Is
1000000een miljoen of tien miljoen? - Wanneer
- Bij getallen van vijf of meer cijfers in code: limieten, bedragen in centen, tijden in milliseconden.
1__0en1_zijn een SyntaxError. - Waar
- Alleen in broncode (sinds ES2021). Niet in JSON en niet in invoer:
Number('1_000')isNaN. - Wie
- Iedereen; het is pure leesbaarheid.
0123- Wat
- Een getal met een voorloopnul, gelezen als octaal.
0123is 83. - Waarom
- Overgenomen uit C, uit de begintijd van JavaScript. Het bleef bestaan om oude code niet te breken.
- Wanneer
- Nooit. In strict mode, en dus in modules en classes, is het een SyntaxError. Gebruik
0o123. - Waar
- In oude scripts. Je komt het tegen als bug: een getal met een voorloopnul dat ineens een andere waarde heeft.
- Wie
- Niemand meer. Het staat hier zodat je het herkent.
In tekst en terug
Vanuit tekst gelden andere regels. Number() kent 0x, 0o, 0b en e, maar geen scheidingsteken en geen min vóór een prefix. Een voorloopnul in tekst is gewoon decimaal.
Tekst omzetten naar een getal
Invoer uit formulieren, URL's en bestanden is altijd tekst. Zet die bewust om.
Gebruik Number() als de invoer een getal hoort te zijn, en parseInt/parseFloat alleen als je bewust een getal vóór in een tekst wilt lezen. Geef parseInt altijd het grondtal (10) mee.
Controleren wat je hebt
Afronden en tonen
Casuïstiek
Vier situaties uit de praktijk. Elke casus begint met de code die je als eerste zou schrijven, laat zien waarom die misgaat, en lost het op. Alle code kun je aanpassen en uitvoeren.
Casus 1Twee formuliervelden optellen
Een bestelformulier heeft de velden aantal volwassenen en aantal kinderen. Je wilt het totaal tonen.
.value is altijd een string. Met + plakt JavaScript strings aan elkaar in plaats van op te tellen.
Je zet de tekst bewust om en controleert de uitkomst. Let op: een Nederlandse gebruiker typt 3,5, en Number('3,5') is NaN. Bij kommagetallen vervang je eerst de komma, of je gebruikt <input type="number"> en valueAsNumber.
Casus 2Bedragen optellen in een winkelwagen
Een winkelwagen bevat een product van € 19,99 en een toeslag van € 0,07. Je rekent het totaal uit en slaat het op in centen.
0.1, 19.99 en 0.07 hebben geen exacte binaire vorm, net zoals ⅓ geen exacte decimale vorm heeft (0,333…). Typ 19.99 in de bitweergave bovenaan en je ziet wat er werkelijk bewaard wordt. De kleine afwijkingen stapelen op en worden zichtbaar bij vergelijken, vermenigvuldigen of afronden.
Reken met geld in hele centen: gehele getallen zijn exact.
Tot 253 − 1 is elk geheel getal exact. Je rondt maar één keer af: bij het omzetten van invoer naar centen (Math.round(Number(invoer) * 100)). Pas bij het tonen deel je weer door 100.
Casus 3Een percentage voor een voortgangsbalk
Een takenlijst toont "3 van 8 klaar" met een balk die zich vult.
Bij een lege lijst is het 0 / 0, en dat is NaN. De CSS-waarde wordt 'NaN%' en de balk verdwijnt zonder foutmelding. Delen door nul geeft in JavaScript geen fout maar Infinity of NaN, die stil verder rekenen.
Je vangt het randgeval af vóórdat de rekensom het kan opleveren. Algemeen: deel je door iets wat nul kan zijn, beslis dan zelf wat de uitkomst moet zijn.
Casus 4Een bedrag tonen aan Nederlandse gebruikers
Je wilt 1234.5 tonen als bedrag.
Een punt als decimaalteken en geen scheiding bij duizendtallen: dat leest een Nederlander verkeerd. Bovendien rondt toFixed soms onverwacht af, want 1.005 is in werkelijkheid 1,00499999…
Intl.NumberFormat kent de notatie per taal en land. Je rekent met getallen, en formatteert pas op het laatste moment, voor de mens.
Wanneer juist niet
Niet alles wat op een getal lijkt, hoort een number te zijn.
- Grote gehele getallenBoven 9.007.199.254.740.991 (
Number.MAX_SAFE_INTEGER), zoals ID's uit een database of cryptografie. Alsnumberwordt9007199254740993stil9007199254740992.Gebruikbigint:9007199254740993n - Codes die op getallen lijkenPostcodes, telefoonnummers, IBAN's, ordernummers met een voorloopnul. Daar reken je niet mee.
Number('0612345678')is612345678: de nul is weg.Gebruikstring - Exact decimaal rekenenBuiten centen, zoals rente met veel decimalen of valutakoersen.Gebruik een decimal-library, of reken in de kleinste eenheid
Valkuilen
Klik op voer uit om de uitkomst in je eigen browser te zien.
| Code | Uitkomst | Waarom |
|---|
Samenhang
Vereist
- overzichtWaarden & types
Verwant
- bigintgrote gehele getallen
- stringde omzetting
- vergelijken
==vs===
Hierna
- MathData
- Intl voor getallenData
Toets
13 vragen over alle onderdelen van deze pagina. Bij elke vraag staat over welk onderdeel hij gaat. Je haalt de toets met minimaal 11 goed, en dan beheers je number. Pas na het inleveren zie je wat goed was.