← Go/De eerste bouwstenen
Les 5 van 8
MODULE 01 · 05◷ 24 min

Kies bewust tussen gehele en kommagetallen

Na deze les kun je
  • De typen int en float64 herkennen en hun deling onderscheiden.
  • Een expliciete getalconversie op de juiste plek in een berekening uitvoeren.

Een wandelclub noteert de duur van een tocht in hele minuten. In een verslag wil je diezelfde duur in uren tonen, inclusief een deel van een uur. De keuze tussen gehele en kommagetallen bepaalt of dat deel tijdens de berekening bewaard blijft.

Een waarde heeft een type

Een type bepaalt welke soort waarde een variabele kan bevatten en welke bewerkingen daarbij horen. Met minutes := 95 leidt Go in dit geval het type int af. Met distance := 2.5 krijgt de variabele in dit geval het type float64.

int gebruik je hier voor gehele aantallen. float64 kan ook een gebroken waarde bewaren, zoals twee en een halve kilometer. In Go schrijf je in de broncode een punt als decimaalteken, ook als je in het Nederlands een komma uitspreekt.

Je kunt het type zichtbaar maken met de formaatcode %T van Printf. fmt.Printf("%T\n", minutes) toont int; met distance als argument verschijnt float64. De hoofdletter T laat het type zien, niet de actuele waarde.

Eerst kiezen hoe je deelt

Geheel delen en delen met een breuk
package main

import "fmt"

func main() {
	amount := 21
	groups := 4
	fmt.Println(amount / groups)
	fmt.Printf("%.2f\n", float64(amount) / float64(groups))
}
Verwachte uitvoer
5
5.25

Het voorbeeld verdeelt een gemeten hoeveelheid over vier groepen. De eerste berekening gebruikt twee int-variabelen en levert daarom het aantal complete eenheden op. De tweede berekening gebruikt float64-waarden en bewaart het gebroken deel.

Een conversie maakt een waarde van een ander type. Je schrijft daarvoor de typenaam met haakjes rond de waarde, bijvoorbeeld float64(amount). Het oorspronkelijke amount wordt door dat lezen en omzetten niet gewijzigd.

Go zet variabelen met verschillende numerieke typen niet stilzwijgend naar één gezamenlijk type om. Wil je een int-variabele met een float64-variabele vermenigvuldigen, dan kies je zelf de conversie. Zo blijft in de bron zichtbaar welke vorm van rekenen je bedoelt.

Vormgeven komt na rekenen

Bij Printf toont %f een kommagetal in decimale vorm. Met %.2f vraag je twee cijfers na de punt. De uitvoer 5.25 is dus tekst die de berekende float64-waarde weergeeft met die gekozen precisie.

Die uitvoeropmaak verandert de variabele niet. Een andere formaattekst kan dezelfde waarde later met meer of minder cijfers laten zien. Een zichtbaar afgeronde regel is daarom iets anders dan een gewijzigde rekenwaarde.

Veelgemaakte fout: pas achteraf omzetten

Een verloren breuk komt niet terug
package main

import "fmt"

func main() {
	amount := 21
	groups := 4
	fmt.Printf("%.2f\n", float64(amount / groups))
	fmt.Printf("%.2f\n", float64(amount) / float64(groups))
}
Verwachte uitvoer
5.00
5.25

In de eerste regel wordt de gehele deling al uitgevoerd voordat float64 aan de beurt komt. De uitkomst vijf wordt daarna een float64, maar het verloren kwart komt niet terug. In de tweede regel worden beide waarden vóór het delen omgezet.

Lees een samengestelde expressie daarom van binnen naar buiten. float64(amount / groups) zet de uitkomst van de deling om. float64(amount) / float64(groups) kiest eerst het type van beide waarden en voert vervolgens de deling uit.

Van een meting naar een heel aantal

Omgekeerd kan int(distance) van onze float64-variabele een geheel getal maken. Daarbij verdwijnt het breukdeel; Go rondt niet naar het dichtstbijzijnde gehele getal. Bij 2.5 krijg je twee, en bij een variabele met -2.5 krijg je min twee.

Gebruik dit dus alleen als het weglaten van het breukdeel bij de vraag past. De vorige les liet zien dat het aantal benodigde kratten juist naar boven moet worden berekend. Een typeconversie kiest een getalvorm en neemt die praktische beslissing niet voor je over.

De oefening gebruikt 95 minuten en een afstand van 2.5 kilometer. Toon het type van de minuten, de duur in uren met twee decimalen, het gehele deel van de afstand en ten slotte de oorspronkelijke afstand. Zo controleer je ook dat de conversie de bronwaarde behoudt.

AAN DE SLAG 0/4
1

Het type zichtbaar

Toon op de eerste regel het type van minutes met de formaatcode %T.

2

Van minuten naar uren

Toon op de tweede regel minutes gedeeld door 60 als een kommagetal met precies twee cijfers na de punt.

3

Het gehele afstandsdeel

Toon op de derde regel het gehele deel van distance door de variabele naar int om te zetten.

4

De oorspronkelijke meting

Toon op de vierde regel de oorspronkelijke distance met Println.

Samenvatting

  • int en float64 geven een andere betekenis aan een deling.
  • Kies een conversie vóór de bewerking die het gebroken deel nodig heeft.
  • Een conversie of uitvoeropmaak wijzigt de oorspronkelijke variabele niet.

De volgende les gebruikt vergelijkingen om een vraag met waar of onwaar te beantwoorden.

main.go
UitvoerConsole
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.