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
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
Twaalf vragen over alle onderdelen van deze pagina. Bij elke vraag staat over welk onderdeel hij gaat. Je haalt de toets met minimaal tien goed, en dan beheers je number. Pas na het inleveren zie je wat goed was.