anoniem Geplaatst: 6 mei 2005 Delen Geplaatst: 6 mei 2005 Ik werk met Clipper en wel de moderne versie daarvan xHarbour Builder. (Zie site www.xHarbour.com) Ik sla in een variable met 3 cijfers achter de komma een waarde op van 150. Als ik deze uitprint krijg ik de waarde 149.977 Nu ben ik niet zo geïnteresseerd hoe dat komt alswel hoe ik dit kan voorkomen. Hoe vertel ik de computer dat 150.000 150.000 is en niet 149.977 ?? Ik wil de drie cijfers achter de komma handhaven omdat de waarde inderdaad tussen 0.001 tot 999.999 kan liggen. MVG, perloc P.s. Volgens mij ligt dit niet specifiek aan Clipper. xHarbour enz. maar ligt aan het systeem. Ik wil niet weten hoe dit komt, maar wel hoe ik dit kan voorkomen. Quote Link naar reactie
anoniem Geplaatst: 6 mei 2005 Auteur Delen Geplaatst: 6 mei 2005 Dit probleem zat in Basic, QBasic en zelfs als je ga afronden en daarna ga aftrekken met PHP doet dit probleem zich voor :-? Ik heb dit opgelost door het getal te splitsen en daarna iedere waarde netjes rond te maken en daarna weerk aan elkaar te plakken en er weer een Integer van te maken. Veel werk maar de oplossing loonde zich na afloop wel :) Quote Link naar reactie
anoniem Geplaatst: 7 mei 2005 Auteur Delen Geplaatst: 7 mei 2005 Ik had gehoopt op een eenvoudiger oplossing. Het is niet zo dat "mijn" getal een ingegeven waarde zal hebben van b.v. 230.005 Het is óf 230.000 óf 0.005 Jouw manier zal ik toepassen. Zoiets van: If 1000 * int(<var>) = 1000 * <var> .............. Else .............. Endif Heb het nog niet uitgeprobeerd. Trouwens het probleem treedt op bij getallen > 20.000 20 wordt nog als 20.000 gepresenteerd, 24 = 23.977 Vraag me af of dit probleem ook optreedt in VB of met C++ Anyway, thanks a lot. MVG, perloc Quote Link naar reactie
anoniem Geplaatst: 7 mei 2005 Auteur Delen Geplaatst: 7 mei 2005 [quote:5f74cf8f80="perloc"]Ik werk met Clipper en wel de moderne versie daarvan xHarbour Builder. (Zie site www.xHarbour.com) Ik sla in een variable met 3 cijfers achter de komma een waarde op van 150. Als ik deze uitprint krijg ik de waarde 149.977 Nu ben ik niet zo geïnteresseerd hoe dat komt alswel hoe ik dit kan voorkomen. Hoe vertel ik de computer dat 150.000 150.000 is en niet 149.977 ?? Ik wil de drie cijfers achter de komma handhaven omdat de waarde inderdaad tussen 0.001 tot 999.999 kan liggen. MVG, perloc P.s. Volgens mij ligt dit niet specifiek aan Clipper. xHarbour enz. maar ligt aan het systeem. Ik wil niet weten hoe dit komt, maar wel hoe ik dit kan voorkomen.[/quote:5f74cf8f80] Dat er afrondingsfouten kunnen optreden bij een getal met cijfers achter het decimaal-teken, daar kan ik me nog wel iets bij voorstellen. Maar afrondingsfouten bij het getal 150?? Misschien dat je een ander type variabele moet gebruiken om je variabelen in op te slaan? Wellicht een variabele met een grotere precisie. Of alles opslaan in zogenaamde integer/long-variabelen. En bij het weergeven weer delen door 1000. Quote Link naar reactie
anoniem Geplaatst: 7 mei 2005 Auteur Delen Geplaatst: 7 mei 2005 Clipper/xHarbour is -zover ik weet, en ik werk al jaren met Clipper, (xHarbour is betrekkelijk nieuw voor me) niet zo gesofisticeerd dat er meerdere soorten variabelen zijn te declareren, noch dat er integer-long variabelen bestaan. Ik zal daar naar zoeken. Er zijn twee oplossingen: 1. De door h4xX0r gesuggereerde oplossing (met dank): vermenigvuldigen met 1000 en opslaan en bij uitprinten weer door 1000 delen. 2. De 3 decimalen eruit halen. Een bijbehorend field wordt gevuld met L(iter), dl, cl, ml, M(eter), dm, cm, mm, K(ilo), g, mg, ug of gewoon 1. Dus mijn voorbeeld: 150 g werd 149,977 g Voor beide oplossingen moet ik nogal wat aanpassen in mijn programma. Er is nog een 3de oplossing, het getal analiseren (daar ben ik mee bezig maar dat gaat niet zomaar) en eventueel aanpassen voor uitprinten. MVG, perloc Quote Link naar reactie
anoniem Geplaatst: 7 mei 2005 Auteur Delen Geplaatst: 7 mei 2005 Dat er afrondingsfouten bestaan is me al heel lang bekend. Maar ik vond mét h4xX0r dat het wel wat gortig is dat 150.000 zou worden afgerond tot 149.977 Dus ik ben gaan graven in mijn programma en ben een kapitale fout tegengekomen, een z.g. bug, maar wel zo groot als een olifant. Nu zul je zeggen dat je een olifant niet zo gauw over het hoofd ziet maar mijn programma is daarmee in vergelijking zo groot als afrika. Dus over het hoofd zien is aannemelijk. Lijkt me. Door mijn vraagstelling in deze rubriek ben ik deze tegengekomen, hoewel die vast in een later stadium er een keer was uitgekomen. Het zit té complex in elkaar om het "even" uit te leggen. Sorry aan al degenen die ik op het verkeerde been heb gezet. Maar dit forum is er toch om iets van elkaar (of van jezelf) te leren niet? Dank voor de reacties MVG, perloc Quote Link naar reactie
anoniem Geplaatst: 10 mei 2005 Auteur Delen Geplaatst: 10 mei 2005 Alhoewel topic al enigzins gesloten lijkt wil ik toch nog even een kleine bijdrage doen. De variabele soort Currency is tot 4 decimalen nauwkeurig. In sommige gevallen voorkom je hiermee die 0.000000001 verschillen. Je moet echter wel op blijven letten: [code:1:37a245cc58] Dim a as Currency a= 1/ 3 a = 3* a Msgbox a [/code:1:37a245cc58] Als je dit uitvoert krijg je 0.9999! Over het algemeen gebruik ik geen Currency, maar het is wel een variable om te onthouden! Quote Link naar reactie
anoniem Geplaatst: 12 mei 2005 Auteur Delen Geplaatst: 12 mei 2005 Slechte zaak!! 3 x (1 : 3) = 1 !!! Ik heb het uitgeprobeerd: Ik krijg: a = 1 / 3 a = a * 3 Msgbox a (Bij mij: @ 10,0 say a) Resultaat: a = 1.00 Als ik 9 decimalen opgeef krijg ik 1.000000000 En dat is juist. Bijdeweg: ik Heb geen statement: Dim a as currency Maar zoals gezegd, de fout lag niet in onnauwkeurigheid bij afronden, maar in een blunder in mijn programma. MVG, perloc Quote Link naar reactie
Aanbevolen berichten
Om een reactie te plaatsen, moet je eerst inloggen