Archief - [PROG]-[JAVA] Problemen bij een prog ivm euro's.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Teknoman

Legacy Member
Wij moeten dus voor java ook wat oefeningen thuis maken. Eén van die oefeningen is: "Maak een programma 'Wissel' dat een bedrag in euro (een geheel getal) inleest en zegt hoe je dit met zo weinig mogelijk briefjes en munten kunt uitbetalen." Al goed en wel, dat ging zonder fouten.
De volgende oefening dan: "Breid vorige oefening uit zodat je ook cent kan ingeven."
Normaalgezien klopt mijn methode perfect maar de waarden van de 1 en 2 centen komen verkeerd uit bij sommige getallen. Bij bvb 0.89 euro komt het juist uit maar bij 1.89 euro komt het verkeerd uit. Bij 0.13 en 1.13 zijn de waarden van 1 en 2 cent ook verschillend. Dat zou toch niet mogen aangezien die centen los staan van de euros?

De sourcecode: http://users.telenet.be/teknoman/Wissel.java

Krueger

Legacy Member
Je cast 2* naar een int. Rond deze juist af? Wat jij wil is dat 5.99 naar 5 wordt afgerond, gebeurt dat ook?

schop aars

Legacy Member
kpeis da ge tbeste uw getal bv 542.86 in twee spits nl 542 en 86.
die 86 gebruikte dan om uw centen te berekenen en die 542 voor uw euro's

ZeeraaR

Legacy Member
medunkt als je cast van double naar int, valt alles achter de comma gewoon weg.

wat je ook kunt doen is

Code:
euro500 = ((int)x / 500);
x = euro%500;
...
euro1 = ((int)x / 1);
x = euro%1;
x *= 100;
euroCent50 = ((int)x / 50);
x = euro%50;
...

Teknoman

Legacy Member
schop aars zei:
kpeis da ge tbeste uw getal bv 542.86 in twee spits nl 542 en 86.
die 86 gebruikte dan om uw centen te berekenen en die 542 voor uw euro's

Bedoelt ge om ze beiden apart in te laten geven ofzo?
Als ge kijkt naar de source ziet ge dat ik de euro's en de eurocenten opsplits.

MilM

Legacy Member
Hij cast om het geheel getal over te krijgen hé ...
Daarna doet hij 'zijn double - zijne int' om de centen te krijgen, waarna hij met 100 vermenigvuldigt om van een kommagetal een geheel getal te maken.

Ik zie het ook niet direct, maar als ik jou was, zou ik eens de code grondig verkleinen door met tabellen te werken.
één met de waarden van d emuntstukken, nl 500 200 100 ...
en één om op te slaan hoeveel er van elk zijn
Voor uit te schrijven kun je ook een lusje gebruiken.

Je kunt zo achter een kleine domme fout dat je over het hoofd ziet blijven kijken en door het rap opnieuw te doen is ze mss wel weg. En minder code zal mss de fout duidelijker maken.


Btw, kunt ge keer posten wat hem dan precies fout truggeeft ?

Krueger

Legacy Member
Momenteeel heb ik hier geen Java compiler staan, maar zo een fout is toch makkelijk op te sporen door stap voor stap door uw code te gaan tijdens het uitvoeren. Dan zie je perfect wanneer em wat verkeerd doet. Vooral in dit geval lijkt het me dat je zo je fout in 1 2 3 gevonden zal hebben.

Kn0t

Legacy Member
Rekenen met floats of doubles geeft steeds benaderingen, en geen exacte resultaten. Floats en doubles kunnen niet alle getallen in hun range exact voorstellen. Dit komt door hun interne representatie (computerarchitectuur zit ver dus ik kan niet meer exact zeggen hoe het zit, maar tis 1 signbit, x aantal bits voor de exponent en x aantal bits voor het grondtal). Kijk eens naar de klasse BigDecimal.

Krueger

Legacy Member
Kn0t zei:
Rekenen met floats of doubles geeft steeds benaderingen, en geen exacte resultaten. Floats en doubles kunnen niet alle getallen in hun range exact voorstellen. Dit komt door hun interne representatie (computerarchitectuur zit ver dus ik kan niet meer exact zeggen hoe het zit, maar tis 1 signbit, x aantal bits voor de exponent en x aantal bits voor het grondtal). Kijk eens naar de klasse BigDecimal.
Maar er worden bij mijn weten wel meer dan genoeg bits gebruikt om de eerste 2 getallen na de komma voor te stellen zonder fouten.

Kn0t

Legacy Member
Ja, maar het is bij het rekenen met floats en doubles dat er benaderingen gebeuren. Maar zoals ik al zie, ik ken er zelf het fijne niet van. Maar iig als je exacte resultaten nodig hebt, wat zeker het geval is bij financiële applicaties zoals dit, vermijd je best floating points. Gebruik dan best ints of longs voor het deel voor de komma en één voor het deel na de komma, of gebruik BigDecimal.

In uw voorbeeld is het specifiek dit wat een probleem geeft:
1.89-0.89, dit komt namelijk op 0.9999999999.

Probeer maar es met een System.out.println(1.89-0.89);

:)

schop aars

Legacy Member
Teknoman zei:
Bedoelt ge om ze beiden apart in te laten geven ofzo?
Als ge kijkt naar de source ziet ge dat ik de euro's en de eurocenten opsplits.

ik bedoel hetvolgende:

ipv uwe string(vb 562.12) om te zetten naar nen double zet ge het eerste deel(voor de komma of punt) om naar nen integer en het tweede deel(na de komma of punt) ook naar een integer en dan past ge uw stuk code van de euro's toe op de integer waar ge uw euro's hebt ingestoken en het stuk code van de centen op de integer waar ge de centen hebt ingestoken)

Teknoman

Legacy Member
En hoe doe ik dat? (Ik ben nog een ferme noob in java, dus het zou kunnen dat het wat onnozel is om dat te vragen.)

MilM

Legacy Member
Teknoman zei:
En hoe doe ik dat? (Ik ben nog een ferme noob in java, dus het zou kunnen dat het wat onnozel is om dat te vragen.)

met ne stringbuffer. (klasse StringBuffer)
aangezien je in uw programma niet verplicht bent om eurocent in te geven (5 euro zullen ze niet ingeven als 5,00), kun je niet zomaar in twee splitsen. (je kent namelijk de posities niet)
Daarom moet je het kommateken opzoeken en aan de hand daarvan kun je hem dan opslitsen in twee strings (is er geen komma, dan in één string)

en dan die casten naar een int

Kn0t zei:
In uw voorbeeld is het specifiek dit wat een probleem geeft:
1.89-0.89, dit komt namelijk op 0.9999999999.

Probeer maar es met een System.out.println(1.89-0.89);

:)

Ik weet niet of dit klopt, maar indien dit idd zo is, dan kun je waarschijnlijk gewoon uw 1.89 eerst vermenigvuldigen met 100 (je krijg dan een int, 189 namelijk ipv een double) en dan daarop de bewerkingen doen op int's. Maar echt proper is da waarschijnlijk nie van programmeerstijl. (189/100 zijn dan uw euros en 189%100 zijn dan uw eurocenten)

edit: ik weet niet of je het % kent, aangezien je er geen gebruik van gemaakt heb. Maar het % teken berekent dus gewoon uw rest. ... = 489%100 = 389%100 = 289/100 = 189/100 = 89/100 = 89 (de rest)

.Acku.

Legacy Member
Als het bewerkingen zijn met eurocenten kun je int of long gebruiken, vermenigvuldig dan met 100 zoals minm zijn.

However, echte applicaties werken met BifDecimal als het accuraat (en veilig van overflow) moet zijn. Het is iets omslachtiger want het zijn objecten ipv primitives.

.Acku.

Legacy Member
Btw, parsing kan met:
To format a number for a different Locale, specify it in the call to getInstance.
NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
You can also use a NumberFormat to parse numbers:
Number myNumber = nf.parse(myString);
double num = myNumber.doubleValue();

Teknoman

Legacy Member
Ja, maar wij zitten nog niet zo ver in school ;)
Als ik de euro's en de centen apart laat ingeven dan gaat het allemaal zonder problemen.
En ik ken het teken wel voor de rest MilM ;)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan