Restdeling
Hey,
Op mijn site gebruik ik 3 betaalmiddelen:
Galjoenen (1 Galjoen = 1 euro),
Sikkels (1 Sikkel = 50 cent) en
Knoeten (1 Knoet = 10 cent).
als iets 1 Galjoen, 3 Sikkels en 5 Knoeten kost,
en je hebt: 3 Galjoenen, 2 Sikkels en 5 Knoeten,
dan zou je dat product dus eigenlijk moeten kopen omdat je 2 Galjoenen teveel hebt.
Maar omdat je 1 Sikkel te weinig hebt kun je dit niet kopen!
Nu heb ik gehoord dat je dit probleem kunt oplossen met restdeling, maar ik kan hier nergens wat over vinden.. kan iemand me hier iets van uitleggen?
Op mijn site gebruik ik 3 betaalmiddelen:
Galjoenen (1 Galjoen = 1 euro),
Sikkels (1 Sikkel = 50 cent) en
Knoeten (1 Knoet = 10 cent).
als iets 1 Galjoen, 3 Sikkels en 5 Knoeten kost,
en je hebt: 3 Galjoenen, 2 Sikkels en 5 Knoeten,
dan zou je dat product dus eigenlijk moeten kopen omdat je 2 Galjoenen teveel hebt.
Maar omdat je 1 Sikkel te weinig hebt kun je dit niet kopen!
Nu heb ik gehoord dat je dit probleem kunt oplossen met restdeling, maar ik kan hier nergens wat over vinden.. kan iemand me hier iets van uitleggen?
Als iets 1 Galjoen, 3 Sikkels en 5 Knoeten kost, dan heb je toch genoeg aan 3 Galjoenen. Ik zie/snap het probleem niet.
Is het niet handiger om in je database e.d. gewoon in euro te rekenen en alleen de weergave in galjoenen enzo te doen??
Iets kost 1 Galjoen, 3 Sikkels en 5 Knoeten = 3 euro
Je hebt 3 Galjoenen, 2 Sikkels en 5 Knoeten = 4,50 euro
En dan de volgende functie te gebruiken om het weer naar jouw valuta om te rekenen.
Iets kost 1 Galjoen, 3 Sikkels en 5 Knoeten = 3 euro
Je hebt 3 Galjoenen, 2 Sikkels en 5 Knoeten = 4,50 euro
En dan de volgende functie te gebruiken om het weer naar jouw valuta om te rekenen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
function convert($bedrag){
$galjoenen = ceil($bedrag);
$bedrag = $bedrag - $galjoenen;
$sikkels = ceil($bedrag/0.50);
$bedrag = $bedrag - $sikkels;
$knoeten = ceil($bedrag/0.10);
$bedrag = $bedrag - $knoeten;
echo $galjoenen.'Galjoenen, '.$sikkels.' Sikkels, '.$knoeten.' Knoeten';
}
$galjoenen = ceil($bedrag);
$bedrag = $bedrag - $galjoenen;
$sikkels = ceil($bedrag/0.50);
$bedrag = $bedrag - $sikkels;
$knoeten = ceil($bedrag/0.10);
$bedrag = $bedrag - $knoeten;
echo $galjoenen.'Galjoenen, '.$sikkels.' Sikkels, '.$knoeten.' Knoeten';
}
Gewijzigd op 16/05/2010 00:21:31 door Daan Onbekend
@Daan: Jij gaat fout in je script.
En zo dus ook bij de knoeten.
Code (php)
En zo dus ook bij de knoeten.
Ook in euro's heb je dat probleem.. je hebt bijv. 2 velden:
euro's
centen
stel je hebt: 2 euro en 50 cent
en iets kost: 1 euro en 60 cent
dan kijk je eerst of je genoeg euro's hebt: 2-1=1 euro over; je hebt dus genoeg euro's.
dan bereken je de centen:
je hebt 50 cent en het kost 60 cent: 50-60=-10; je hebt dus te weinig centen.
Je zal op mijn site nu de melding krijgen dat je te weinig geld hebt, die database die weet niet dat 2,50 meer is dan 1,60, die denkt dat je 10 cent te kort komt.
En dát is het probleem. en nu heb ik gehoord dat je dat met restdeling kunt oplossen. maar ik weet dus niet wat restdeling is :P
euro's
centen
stel je hebt: 2 euro en 50 cent
en iets kost: 1 euro en 60 cent
dan kijk je eerst of je genoeg euro's hebt: 2-1=1 euro over; je hebt dus genoeg euro's.
dan bereken je de centen:
je hebt 50 cent en het kost 60 cent: 50-60=-10; je hebt dus te weinig centen.
Je zal op mijn site nu de melding krijgen dat je te weinig geld hebt, die database die weet niet dat 2,50 meer is dan 1,60, die denkt dat je 10 cent te kort komt.
En dát is het probleem. en nu heb ik gehoord dat je dat met restdeling kunt oplossen. maar ik weet dus niet wat restdeling is :P
Ik denk dat het probleem in de database ligt. Waarom maak je niet gewoon 1 veld met het bedrag wat je totaal hebt. En dan kun je met de modulo operator wel gaan berekenen hoeveel je nu van elk muntstuk hebt.
Hoeveel je hebt van elk muntstuk, is alleen iets wat je zou moeten gebruiken voor het weergeven. Niet voor de berekeningen of je wel genoeg geld hebt.
Hoeveel je hebt van elk muntstuk, is alleen iets wat je zou moeten gebruiken voor het weergeven. Niet voor de berekeningen of je wel genoeg geld hebt.
Was me wat aan het vervelen, Het kan zijn dat het wat omslachtig is. Niet getest moet gaan voor een paar uurtjes. zijn meerdere functies. De $betalen en $beurs array's dienen als voorbeeld waarden.
Code (php)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
#| Te betalen bedrag. // Galjoenen, Sikkels, Knoeten
$betalen = array(3, 2, 5);
#| Beurs. // Galjoenen, Sikkels, Knoeten
$beurs = array(5, 3, 4);
#| Functie voor het omzetten van een bedrag naar knoeten.
function bedrag_in_knoeten($bedrag){
return $bedrag[2] + ($bedrag[1] * 5) + ($bedrag[1] * 10);
}
#| Functie voor het terug converteren van een bedrag in knoeten.
function convert_back($bedrag){
#| Galjoenen.
$galjoenen = floor($bedrag / 10);
#| Sikkels.
$sikkels = floor(($bedrag - ($galjoenen * 10)) / 5);
#| Knoeten.
$knoeten = $bedrag - (($galjoenen * 10) + ($sikkels * 5));
#| Resultaat terug geven.
return array($galjoenen, $sikkels, $knoeten);
}
#| Functie voor het controleren of iemand genoeg geld heeft.
function geld_controle($beurs, $betalen){
return (bedrag_in_knoeten($beurs) >= bedrag_in_knoeten($betalen)) ? true : false ;
}
#| Functie voor het berekenen van de nieuwe inhoud van Uw beurs na de betaling.
/*---- LET OP! ---->
Eerst controleren of iemand genoeg geld heeft voordat deze functie wordt aangeroepen.
*/
function beurs_na_betaling($beurs, $betalen){
#| Resterend aantal knoeten berekenen.
$resterend = bedrag_in_knoeten($beurs) - bedrag_in_knoeten($betalen);
#| nieuwe beurs terug geven.
return convert_back($resterend);
}
?>
#| Te betalen bedrag. // Galjoenen, Sikkels, Knoeten
$betalen = array(3, 2, 5);
#| Beurs. // Galjoenen, Sikkels, Knoeten
$beurs = array(5, 3, 4);
#| Functie voor het omzetten van een bedrag naar knoeten.
function bedrag_in_knoeten($bedrag){
return $bedrag[2] + ($bedrag[1] * 5) + ($bedrag[1] * 10);
}
#| Functie voor het terug converteren van een bedrag in knoeten.
function convert_back($bedrag){
#| Galjoenen.
$galjoenen = floor($bedrag / 10);
#| Sikkels.
$sikkels = floor(($bedrag - ($galjoenen * 10)) / 5);
#| Knoeten.
$knoeten = $bedrag - (($galjoenen * 10) + ($sikkels * 5));
#| Resultaat terug geven.
return array($galjoenen, $sikkels, $knoeten);
}
#| Functie voor het controleren of iemand genoeg geld heeft.
function geld_controle($beurs, $betalen){
return (bedrag_in_knoeten($beurs) >= bedrag_in_knoeten($betalen)) ? true : false ;
}
#| Functie voor het berekenen van de nieuwe inhoud van Uw beurs na de betaling.
/*---- LET OP! ---->
Eerst controleren of iemand genoeg geld heeft voordat deze functie wordt aangeroepen.
*/
function beurs_na_betaling($beurs, $betalen){
#| Resterend aantal knoeten berekenen.
$resterend = bedrag_in_knoeten($beurs) - bedrag_in_knoeten($betalen);
#| nieuwe beurs terug geven.
return convert_back($resterend);
}
?>
Gewijzigd op 16/05/2010 13:37:38 door - Mark -
@Mark: inderdaad omslachtig. Veel eenvoudiger is het om, zoals Gerben al zegt, te werken met 1 waarde die het totale bedrag dat je bezit aangeeft. Op die manier is eenvoudig te controleren of je voldoende 'geld' hebt om een bepaald product te kopen. Voor de weergave kun je dat bedrag vervolgens vertalen naar Galjoenen, Sikkels en Knoeten...
Gewijzigd op 16/05/2010 13:40:04 door Joren de Wit
@Blanche: Weet ik maar ik gok dat hij ze alle drie appart in de database heeft staan dus dan moet hij alles weer veranderen. Daarom voed ik de functies ook met array's. Met omslachtig bedoelde ik de manier waarop de functies in zijn werk gingen.
Quote:
Weet ik maar ik gok dat hij ze alle drie appart in de database heeft staan dus dan moet hij alles weer veranderen.
Naar mijn mening is dat dan precies wat hij moet doen. Gebruik liever geen lapmiddelen als het echte probleem eenvoudig op te lossen is ;-)




