Ga naar inhoud

Afronden naar hele getallen

Zelfs de beste ontwikkelaars struikelen over hoe je moet afronden. Het lijkt eenvoudiger dan het is.

De makkelijkste manier om een kommagetal (float) af te ronden naar een heel getal, is met behulp van de ingebouwde functie round(), maar dit werkt niet als je consistent halve getallen naar boven wilt afronden:

We nemen een kommagetal, en plaatsen het tussen haakjes. Bijvoorbeeld:

round(2.3)

result: 2

Schijn bedriegt

Maar pas op! Want deze functie werkt niet zoals je bij wiskunde geleerd hebt.

Op de middelbare school leer je, dat je halve getallen hoort af te ronden naar boven. 2.5 wordt dus 3.

Echter, wanneer we dit bij Python doen, (en bij vele andere programmeertalen werkt dit net zo), dan retourneert de functie 2.

round(2.5)

result: 2

Dit komt doordat Python uitgaat van de banker's rounding. Concreet betekent het dat getallen eindigend op .5 worden afgerond naar het dichtstbijzijnde even getal.

round(1.5) en round(2.5) ronden dus beiden af naar 2.

Aangezien halve getallen veelvuldig voorkomen leidt dit in principe tot statistisch nauwkeurigere berekeningen.

1.5 + 2.5 is immers 4 tezamen. Als beide getallen naar boven zouden zijn afgerond, dan zou het 5 zijn geweest, wat verder van de werkelijkheid afligt.

Echter, er zijn situaties waarin dit niet handig is. Dan kun je met behulp van de (native) package decimal toch de berekening doen zoals je op school geleerd werd.

Halve getallen naar boven afronden

We beginnen door de klasse Decimal, en de constante ROUND_HALF_UP te importeren.

from decimal import Decimal, ROUND_HALF_UP

Vervolgens zetten we het kommagetal (de float) om naar een Decimal. In het voorbeeld hieronder gebruiken we 2.5.

getal = Decimal(2.5)

Dit getal moeten we vervolgens kwantiseren; met andere woorden, we gaan hem afronden naar een gespecificeerd aantal decimalen.

Dit doen we met behulp van de quantize() methode. We kunnen het aantal decimalen specificeren door als eerste parameter bij Decimal een voorbeeld te geven zoals '1.0' of '1.00'. Aangezien we hier op zoek zijn naar hele getallen, is het voorbeeld '1'. Daarnaast specificeren we als argument voor de rounding dat halve getallen omhoog moeten worden afgerond.

getal = number.quantize(
                Decimal('1'), rounding=ROUND_HALF_UP)

Dit retourneert de waarde Decimal('3'), en 3 is waar we naar op zoek waren.

Als je het in een functie wilt zetten, en het direct wilt retourneren als integer (hele getallen), dan zou je dit als volgt kunnen doen:

from decimal import Decimal, ROUND_HALF_UP

def round_half_up(number: float) -> int:
    number = Decimal(number)
    number = number.quantize(
        Decimal('1'), rounding=ROUND_HALF_UP)
    return int(number)

Nu kunnen we de nieuwe functie round_half_up() gebruiken om 1.5 af te ronden naar 2, en 2.5 naar 4.

round_half_up(1.5)

result: 2

en

round_half_up(2.5)

result: 3

Bedankt voor het lezen, we hopen dat je er iets aan hebt, en onthoud:

Meer kennis, maar ruimte!

Happy coding!

Bekijk ons trainingsoverzicht op quennis.nl



Quennis is een handelsnaam van IFTRIX B.V. | Alle rechten voorbehouden