Bewerkingen geven niet altijd het resultaat dat je verwacht. Eén van de verraderlijkste valkuilen in C# is de deling. Reken even mee:
Console.WriteLine(7 / 2);
Je zou misschien 3.5 verwachten, maar dit programma toont:
3
In 7 / 2 zijn beide getallen gehele getallen (int). C# redeneert dan zo:
“de invoer zijn gehele getallen, dus het resultaat moet ook een geheel getal
zijn.” Hij voert daarom een gehele deling uit: hij deelt 7 door 2 en gooit
alles achter de komma weg. 7 gedeeld door 2 is 3 met rest 1, en het deel na
de komma (de ,5) valt gewoon weg.
Dat is geen afronding. C# rondt niet af naar het dichtstbijzijnde getal, hij kapt het stuk na de komma af:
| Uitdrukking | Wiskundig | C# (gehele deling) |
|---|---|---|
7 / 2 | 3,5 | 3 |
9 / 5 | 1,8 | 1 |
25 / 4 | 6,25 | 6 |
1 / 2 | 0,5 | 0 |
Let op:
1 / 2geeft0, niet0.5. Als je dat resultaat in een verdere berekening gebruikt, sleept de fout mee en klopt je eindantwoord niet meer.
De truc is om C# te laten weten dat je met kommagetallen wil rekenen. Zodra
minstens één van de twee getallen een kommagetal (double) is, voert C# een
gewone deling uit en blijft het deel na de komma behouden.
Schrijf 7.0 in plaats van 7 (of 5.0 in plaats van 5). Door de .0
wordt het een double:
Console.WriteLine(9.0 / 5.0); // 1.8
Console.WriteLine(7.0 / 2); // 3.5 (één kommagetal volstaat)
(double)Werk je met variabelen, dan kan je een van de getallen tijdelijk als double
laten behandelen met een cast: zet (double) voor het getal.
int teller = 9;
int noemer = 5;
Console.WriteLine((double)teller / noemer); // 1.8
Beide manieren geven hetzelfde resultaat. Welke je kiest, hangt af van of je met vaste getallen of met variabelen werkt.
Wat als je net wél een geheel resultaat wil? Dan is de gehele deling precies wat je nodig hebt. In combinatie met de rest-operator
%kan je er bijvoorbeeld een aantal seconden mee omzetten naar uren, minuten en seconden. Verderop in deze reeks gebruik je dat volop.