[vba] afronden

Pagina: 1
Acties:

  • 107mb
  • Registratie: Juni 2004
  • Laatst online: 18:52
ik heb een stukje code geprogrammeerd in VBA om optimaal in een gesorteerde lijst te kunnen zoeken.

hierbij moet de volgende berekening worden uitgevoerd:

midden = (begin + einde) / 2

alle variabelen zijn integers

nu lijkt deze berekening compleet willekeurig mis te gaan bij het afronden.
zo wordt (100 + 1) / 2 = 50

ik krijg het dus niet voor elkaar om de waarde die midden moet krijgen om die correct af te ronden.

het volgende heb ik ook geprobeerd maar zonder resultaat:
midden = Cint(begin + einde) / 2

Verwijderd

heb je niet iets van een round functie in VBA, want meestal wordt er bij het typecasten van een decimaal naar een integer gewoon gehakt, dwz alles achter de punt (of komma) wordt verwijderd.

Verwijderd

107mb schreef op dinsdag 30 november 2004 @ 23:15:
ik heb een stukje code geprogrammeerd in VBA om optimaal in een gesorteerde lijst te kunnen zoeken.

hierbij moet de volgende berekening worden uitgevoerd:

midden = (begin + einde) / 2

alle variabelen zijn integers

nu lijkt deze berekening compleet willekeurig mis te gaan bij het afronden.
zo wordt (100 + 1) / 2 = 50

ik krijg het dus niet voor elkaar om de waarde die midden moet krijgen om die correct af te ronden.

het volgende heb ik ook geprobeerd maar zonder resultaat:
midden = Cint(begin + einde) / 2
Tja, dat is het probleem (of beter gezegd, de eigenschap) van een Integer.
In dit geval is het resultaat overigens afhankelijk van het type variable waarin je de uitkomst wilt opslaan. Als midden ook een Integer is, wordt er niet normaal afgerond, maar wordt alles achter de komma afgekapt (9,9 wordt 9, niet 10). In jouw voorbeeld:
(100 + 1) / 2 = 50, (101 + 1) / 2 = 51, (102 + 1) / 2 = 51, (103 + 1) / 2 = 52.

Je kunt dit op 2 manieren oplossen:
1.
Zorg dat de uitkomst eerst in een Single variable (met drijvende komma) komt, waarna je op de normale manier kunt afronden.
2.
Test met behulp van de MOD functie of er een restgetal is. Zoja, verhoog in dat geval je uitkomst met 1.
midden = (begin + einde) / 2
IF (begin + einde) MOD 2 = 1 THEN midden = midden + 1

Dit werkt alleen goed zolang de deling door 2 is.

Ik hoop dat je hier iets aan hebt.

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
107mb schreef op dinsdag 30 november 2004 @ 23:15:
ik heb een stukje code geprogrammeerd in VBA om optimaal in een gesorteerde lijst te kunnen zoeken.
Dan denk ik aan binary search, en het maakt in dat geval volgens mij niet veel uit of je afrond of afkapt.

"He took a duck in the face at two hundred and fifty knots."