[VB 6.0] Fout in de Round functie?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Fout in de Round functie :?

Round(2.5) levert bij mij 2 op. Round(2.51) levert wel netjes 3 op.

Ziet iemand hier de logica van?

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 03-02 23:18

D2k

Round(2.50) ?
wat doet dat?

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 15-07 21:03
Ja duh, dat is toch logisch.
Zo werkt die functie, als ie 2,5 is, rond ie hem af naar beneden, is ie 2,51 rond ie hem af omhoog :)

[edit]
D2k schreef op 13 november 2002 @ 10:40:
Round(2.50) ?
wat doet dat?
Die maakt een INT van een FLOAT :)
[/edit]

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

En wat meer informatie:
http://www.xbeat.net/vbspeed/c_Round.htm
The native VB6 Round is problematic:
VB6 Round rounds 1/2 to nearest the even number (aka 'Banker's rounding')
Round(1.5) => 2
Round(2.5) => 2 !! should be 3 in 'Other people's rounding'
VB6 Round does *not* support numDecimalPlaces to be negative, eg:
Round(123.45, -1) => 120 !! run-time error 5 in VB6
Gevonden met Google

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 03-02 23:18

D2k

zuigerig :{
waarom zou je die functie zo implementeren?

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 15-07 21:03
In VB script werkt ie volgens mij wel goed hoor :o
http://www.devguru.com/..../round.html

[edit]
Zal eens ff testen.....
[/edit]

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

D2k schreef op 13 november 2002 @ 10:46:
zuigerig :{
waarom zou je die functie zo implementeren?
* gorgi_19 blijft copy pasten.. :+

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
              ... some people think "Banker's rounding" is bad,
but it is not the case. This "Banker's" method uses the Gauss 
rule that if you are in an perfect half case, you must round to the 
nereast digit that can be divided by 2 (0,2,4,6,8). This rule is 
important to obtain more accurate results with rounded numbers after 
operation.

Now, an example :
                  2 digits                2 digits
Unrounded    "Standard" rounding    "Gaussian" rounding
  54.1754      54.18                  54.18
 343.2050     343.21                 343.20
+106.2038    +106.20                +106.20 
=========    =======                =======
 503.5842     503.59                 503.58

Which one is nearer from unrounded result ? The "Gaussian" one 
(Difference of 0.0042 with "Gaussian/Banker" and 0.0058 
with "Standard" rounding.)

Another example with half-round cases only:
                   1 digit                1 digit
Unrounded    "Standard" Rounding    "Gaussian rounding"
  27.25        27.3                   27.2
  27.45        27.5                   27.4  
+ 27.55      + 27.6                 + 27.6
=======      ======                 ======  
  82.25        82.4                   82.2

Again, the "Gaussian" rounding result is nearer from the unrounded 
result than the "Standard" one.


Dit schijnt de reden te zijn.. (Moet het zelf nog ff bestuderen.. :P)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 03-02 23:18

D2k

mjah dat kan wel "de dichtsbijzijnde" zijn
maar waarom leer je dan dat
2.49999999999999999 -> 2
en
2.50000000000000000 -> 3 :?
* D2k denkt dat VB zuigt :Y) op dit punt dan en imho enz enz :+

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 15-07 21:03
Dat is stom, check ff m'n zojuist gemaakt ASP pagina:
ASP pagina

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Het voorbeeld gaat uit van tussentijds afronden, waarbij de fouten kunnen optreden. Op deze manier kan verklein je dus de foutkans.. :)

In VB.Net hebben ze dit er wel uitgesloopt.. (Anders heb ik een klein probleempje met mijn pakket, denk ik.. :P)
Kermit schreef op 13 November 2002 @ 10:54:
Dat is stom, check ff m'n zojuist gemaakt ASP pagina:
ASP pagina
VB6 != VBscript; weet niet of ze hier een andere functie voor hebben geschreven...
Kan je ze anders ook proberen voor de waarden 3 en 4?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 03-02 23:18

D2k

Kermit schreef op 13 november 2002 @ 10:54:
Dat is stom, check ff m'n zojuist gemaakt ASP pagina:
ASP pagina

zet even de acties erbij ;)
het ene is VB round? en het andere?

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 15-07 21:03
D2k schreef op 13 November 2002 @ 10:55:

[...]

zet even de acties erbij ;)
het ene is VB round? en het andere?
Het is allebei ROUND...
wacht...
ASP.NET Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
<%
afrond1 = Round(1.5)
afrond2 = Round(2.5)
Response.write("1<B>.</B>5 wordt: " & afrond1 & "<BR>")
Response.write("2<B>.</B>5 wordt: " & afrond2 & "<P>")

afrond3 = Round(1,5)
afrond4 = Round(2,5)
Response.write("1<B>,</B>5 wordt: " & afrond3 & "<BR>")
Response.write("2<B>,</B>5 wordt: " & afrond4 & "<P>")
%>

Acties:
  • 0 Henk 'm!

  • FitNiX
  • Registratie: April 2001
  • Laatst online: 15-07 21:03
Het werkt in VB precies hetzelfde hoor :o
Zal ff screenie maken van zojuist gebouwde proggie.....
Be Right Back..... :)

[edit]
Afbeeldingslocatie: http://home.planet.nl/~ponti019/round_in_vb.gif

Je moet dus gewoon een komma gebruiken... :)
[/edit]

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wow, check nu pas weer. Best wat reacties teweeg gebracht zo ;)

Best vaag dat Banker's algoritme, zie nog niet helemaal de logica in van het minimaliseren van afrondingsfouten, moet ik het wat beter bestuderen.

Komt banker trouwens van bankier? Dan maakt het geen zak uit, die applicatie die ik maak is toch bedoeld voor economen :X

Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 09:13

Crazy D

I think we should take a look.

In code moet je met een getal altijd een . als decimaalteken nemen... Doe je Round(1,2) dan ziet ie de int 1, die je op 2 posities achter de komma wilt afronden => gewoon 1 dus.

(o.a. met format(1.1, "0.0") kun je checken wat je decimaalteken is, bij mij geeft dit 1,1 => , dus :) Maar een hard gecodeerde float doe je altijd met een . )

De logica achter het afronden geloof ik direct. Ik heb niet voor niets een computer die dat voor me doet :P En hoe dat zoekt ie zelf maar uit... :D

Exact expert nodig?


Acties:
  • 0 Henk 'm!

  • -bolio-
  • Registratie: Juli 2001
  • Laatst online: 20-07 11:45

-bolio-

Gamertag: BolioDraak

Ik ben zoiets ook een keer tegen gekomen in een andere taaltje (weet alleen niet meer welke) wat ik toen deed was gewoon 0.5 bij het getal optellen en dan naar beneden laten afronden. Weet alleen niet of zo'n functie ook in vb zit

Acties:
  • 0 Henk 'm!

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 20-07 22:11

Sponge

Serious Game Developer

Zo zijn er meer van die gevallen in VB, zoals bijv CInt() en Int()

Acties:
  • 0 Henk 'm!

Verwijderd

je moet ook niet vergeten dat floats nooit precies opgeslagen zijn, door de interne binaire representatie ervan

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 05:34
Verwijderd schreef op 13 november 2002 @ 20:43:
je moet ook niet vergeten dat floats nooit precies opgeslagen zijn, door de interne binaire representatie ervan
Zeg nooit nooit: 2.5 kan toevallig wél exact opgeslagen worden, als: (1 + (1/2) ^ 2) * (2 ^ 1). Dit geldt voor alle getallen die (binnen het redelijke) met een eindig aantal machten van 2 genoteerd kunnen worden. De exponenten daarvan moeten wel een beetje dicht bij elkaar liggen, though.

(Een meer gedetailleerde uitleg is wel een aantal keer gegeven, maar die is helaas vast niet te vinden met de search.)

Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 22-07 22:12

SA007

Moderator Tweaking
In plaats van de Round functie kun je ook doen
<code>
Int(Getal +0.5)
</code>
Dat doet het wel goed

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 03-02 23:18

D2k

SA007 schreef op 13 november 2002 @ 22:03:
In plaats van de Round functie kun je ook doen
<code>
Int(Getal +0.5)
</code>
Dat doet het wel goed

das een ranzige oplossing imho

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Niks ranzigs aan hoor :) Word heeeel veel gebruikt hoe denk je dat een round dat zelf doet :D
Pagina: 1