Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi kaufmännisch auf 0,5 oder 1 runden (https://www.delphipraxis.net/114161-kaufmaennisch-auf-0-5-oder-1-runden.html)

juergen 20. Mai 2008 20:28


kaufmännisch auf 0,5 oder 1 runden
 
Hallo zusammen,

ich versuche nun schon seit einiger Zeit ein bestimmtes Rundungsergebnis zu erreichen.
Habe auch schon vieles hier gelesen und auch ausprobiert, aber ich konnte mein Problem damit leider noch nicht selbstständig lösen. :oops:
Generell benötige ich eine Rundung, wo als Ergebnis immer nur eine Null oder eine 5 hinter dem Komma stehen soll; abhängig von dem Ergebnis der kaufmännischen Rundung.
Quasi in 0,5er Einheiten kaufmännisch runden, anstelle der gewohnten 1er Einheiten.
Beispiele:
12,2499 -> 12,0
12,25 -> 12,5
12,49 -> 12,5
12,5 -> 12,5
12,74 -> 12,5
12,75 -> 13,0
13,24454645 -> 13,0

Könnte mir hier jemand weiterhelfen?

Vielen Dank schon mal im Voraus!

Hansa 20. Mai 2008 20:33

Re: kaufmännisch auf 0,5 oder 1 runden
 
Die 12,50 ist ein Knackpunkt. Aber das hier auch ? :shock:

Zitat:

Zitat von juergen
12,49 -> 12,5


JasonDX 20. Mai 2008 20:37

Re: kaufmännisch auf 0,5 oder 1 runden
 
Delphi-Quellcode:
round(x*2)/2
müsste hinhaun ;)

greetz
Mike

juergen 20. Mai 2008 21:12

Re: kaufmännisch auf 0,5 oder 1 runden
 
@Hansa,
ja, so soll/ muss es sein sein :wink:

@JasonDX,
Round hatte ich hier bei meiner kaufmännischen Rundung auf Grund des Verhaltens (Bankers Rounding) gar nicht in Betracht gezogen.
Dein Vorschlag funktioniert schon fast perfekt, vielen Dank! :thumb:
Allerdings wird z.B. bei 12,25 auf 12 abgerundet, ich benötige allerdings genau ab 12,25 das Ergebnis -> 12,5, also eine Aufrundung.
Als Workaround könnte ich 0.0000000001 vor dem Round hinzuzählen...

Hat noch jemand einen Lösungsansatz?

grenzgaenger 20. Mai 2008 21:16

Re: kaufmännisch auf 0,5 oder 1 runden
 
Zitat:

Zitat von juergen
12,74 -> 12,5
12,75 -> 13,0

kaufmännisch runden? :gruebel: :gruebel: :gruebel:

sag mal, was und wie willste genau runden? nur kaufmännisch runden, ist das nicht... :pale: :pale:

juergen 20. Mai 2008 21:37

Re: kaufmännisch auf 0,5 oder 1 runden
 
@grenzgaenger,
du hast Recht, das richtige kaufmännische Runden ist es natürlich nicht.
Ich möchte im Prinzip in 0,25er Schritten kaufmänisch runden, anstelle in 0,5er Schritten.

Mein Anwendungsfall:
Ermittlung von Urlaubsanspruch beim Arbeitsbeginn im lfd.Jahr. :wink:
Es gibt u.a. die Regelung, dass der Urlaubsanspruch kaufmännisch auf halbe Tage gerundet wird.
Wenn dann z.B. ein neuer Mitarbeiter am 15.Mai anfängt und er einen Ganzjahres-Urlaubsanspruch von 28 Tagen hat, so ergäbe das einen Urlaubsanspruch für dieses "angebrochene" Jahr von 17,672131147541 Tagen, "kaufmännisch" auf halbe Tage gerundet wären es dann 17,5 Tagen.

Der Knackpunkt ist eben das kaufmännische Runden auf halbe Tage.

grenzgaenger 20. Mai 2008 21:53

Re: kaufmännisch auf 0,5 oder 1 runden
 
willst du jetzt in halbe schritte runden (x := trunc(x * 2) / 2) oder in 1/4 (x := trunc(x * 4) / 4)?

PS: ggf. kannst du noch 'n hundertstel dazu zählen... oder round hernehmen

Marc. 25. Mai 2008 14:09

Re: kaufmännisch auf 0,5 oder 1 runden
 
Hi juergen!
Was hälst Du denn von einer simplen If-Abfrage?
Delphi-Quellcode:
function myround(z: real): real;
var r: real;
begin
   r := frac(z);

   if (r >= 0.25) and (r < 0.75) then result := trunc(z) + 0.5 else
   if (r >= 0.75)               then result := trunc(z) + 1   else
                                      result := trunc(z);
end;
Cheers,
Marc

[edit] Funktion korrigiert [/edit]

Der.Kaktus 25. Mai 2008 14:11

Re: kaufmännisch auf 0,5 oder 1 runden
 
Altes kaufm. Runden geht mit "Wert *50 /100" (wennch mich richtig erinner*g*)

grenzgaenger 25. Mai 2008 14:35

Re: kaufmännisch auf 0,5 oder 1 runden
 
:-)

fast hat normal immer das selbe schema

abschneiden(betrag * faktor) / faktor

wenn aufgerundet werden soll, wird dann noch 'n kleiner betrag hinzugezählt, damit aufgerundet wird, bevor die die stellen abgeschnitten werden...

also

abschneiden(betrag * faktor + addon) / faktor

bei einem hundertstel (zwei dezimalstellen), x = trunc(23,501 * 100 + 0.5) / 100 --> 2350,1 + 0.5 --> 2550,6 --> 2550 --> 25,50

auf diese weise durfte man immer in basic runden... ;-)

bei rundung aufs fünferl, ist der faktor 20 ... :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz