Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

Computer nauwkeurig? Nee!

perloc
7 antwoorden
  • 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.
  • 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 :)
  • 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: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.
  • 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
  • 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
  • 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!

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.