Anmelden

View Full Version : VRUNDEN() in RPG



Seiten : [1] 2

itec01
02-06-23, 10:21
Hallo,
hat jemand sich schon mal an der Excel VRUNDEN Funktion im RPG versucht oder gibt es da eine fertige Funktion, glaube aber nicht.
VRUNDEN:
Hier kann man nämlich auf das Vielfache eines angegebenen Wertes runden. Dabei wird sowohl auf- als auch abgerundet. Es wird immer in die Richtung gerundet, in der das Vielfache näher an meiner Zahl liegt.
Beispiel
VRUNDEN(7,4;5) = 5
VRUNDEN(7,5;5) = 10

Danke schon mal.
Gruß Klaus

Fuerchau
02-06-23, 11:12
Das ist doch ein alter Hut:

eval faktor = %int(Wert:Rundung);
if %rem(Wert:Rundung) > *zero;
faktor += 1;
endif;
eval neuerwert = faktor * Rundung;

Dies ist grundsätzlich Aufrundung.
Möchte man negative Werte abrunden, ist der faktor mit -1 zu vermindern.

Das klappt mit allen Werten, die nicht 0 sind;-).

itec01
02-06-23, 11:22
dein Beispiel rundet aber immer auf, VRUNDEN rundet auch ab. Siehe mein Beispiel und %REM geht nur mit Ganzzahlen. Oder sehe ich etwas falsch?

Fuerchau
02-06-23, 11:38
Ja stimmt, mann kann dan halt
select;
when faktor * rundung = wert;
neuerwert = wert;
when wert > *zero;
neuerWert = (faktor + 1) * rundung;
other;
neuerwert = (faktor - 1) * rundung;
endsl:

itec01
02-06-23, 12:04
irgendwie stehe ich auf dem Schlauch.
Faktor wird in der Schleife hochgezählt und startet mit 1, richtig?
Rundung wäre 5 in meinem Beispiel und Wert müsste dann 7,4 sein, richtig?
wenn ja, dann kann die Abfrage when wert > 0 nicht passen.
Lass mal, ich schaue mir das anders an, hatte auch die Hoffnung, dass es da etwas fertiges gibt.

Fuerchau
02-06-23, 12:32
Noch mal komplett:

eval faktor = %int(Wert:Rundung);

select;
when faktor * rundung = wert;
neuerwert = wert;
when wert > *zero;
neuerWert = (faktor + 1) * rundung;
other;
neuerwert = (faktor - 1) * rundung;
endsl;

7,5 / 5 = 1
when 1 * 5 = 7,5 => 7,5
when 7,5 > 0 => (1+1) * 5 = 10
other => (1-1) * 5 = 0

-7,5 / 5 = -1
when -1 * 5 = -7,5 => -7,5
when -7,5 > 0 => (-1+1) * 5 = 0
other => (-1-1) * 5 = -10

Das ganze dann in eine schöne Funktion "VRunden" gepackt.

itec01
02-06-23, 13:15
sorry das kann nicht richtig sein.
Bei einem Wert von 7,5 und einer Rundung muss 10 als Ergebnis kommen. Bei einem Wert von z.B.: bei 7,49 muss 5 kommen, weil 7,49 näher an 5 ist als an 10.
Ich mache es jetzt anders:
Wert = 7,5
Rundung = 5
Do x

if (x * 5) > 7,49
if %abs((x*5)-7,49) < %abs(((x-1)*5)-7,49)
eval Ergebnis = (x-1)*5
else
eval Ergebnis = x*5
EndIf
EndIf
x =+
Enddo

Bei einem minus Input Value muss es umgekehrt geprüft werden.
Ich packe das mal in eine Funktion.

B.Hauser
02-06-23, 13:39
Einfach: Dividieren, Runden und danach multiplizieren

Ich hab's jetzt hier nur mit SQL ... aber in RPG sollte es genauso funktionieren:



Values(Round(7,4 / 5,0 , 0) * 5);
Values(Round(7,5 / 5,0 , 0) * 5);
Values(Round(7,6 / 5,0 , 0) * 5);


Liefert: 5, 10, 10

itec01
02-06-23, 13:57
Oh mein Gott, wie einfach. Super, vielen Dank.

Fuerchau
02-06-23, 14:27
Dann gehts auch mit RPG:

%dech(7,4 / 5,0 : 11 : 0) * 5,0