Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Aufrunden auf den nöchsten 5 oder 10er (https://www.delphipraxis.net/101405-aufrunden-auf-den-noechsten-5-oder-10er.html)

manfred_h 12. Okt 2007 15:20


Aufrunden auf den nöchsten 5 oder 10er
 
Hallo zusammen

habe ein Problem das ich einen Wert immer auf den nächsten 5er oder 10er
Aufrunden muss.

z.B.
0.5 > 5
2 > 5
5.1 > 10
8 > 10

könte mir da wer helfen?
Habe es schon die Suche Verwendent aber leider nichts gefunden.

Shalom
Manfred

mkinzler 12. Okt 2007 15:22

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Delphi-Quellcode:
gZahl := (Zahl DIV <schritt> + 1) * <schritt>;

Nikolas 12. Okt 2007 15:23

Re: Aufrunden auf den nöchsten 5 oder 10er
 
teil die Zahl durch fünf, schneide die Kommastellen ab (floor) und multipliziere (das Ergebniss+1) mit 5.

dominikkv 12. Okt 2007 15:24

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Delphi-Quellcode:
  if (Zahl mod 5) > 0 then
    Zahl := (Zahl div 5 + 1) *5;
edit: verschrieben^^

Nikolas 12. Okt 2007 15:28

Re: Aufrunden auf den nöchsten 5 oder 10er
 
0,5 div 5 ?

mkinzler 12. Okt 2007 15:29

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Zitat:

Zitat von Nikolas
0,5 div 5 ?

Ergibt 0

dominikkv 12. Okt 2007 15:32

Re: Aufrunden auf den nöchsten 5 oder 10er
 
stimmt... 0.5 div 5 geht nicht
Zitat:

Operator ist auf diesen Operandentyp nicht anwendbar

manfred_h 12. Okt 2007 15:32

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Ihr Seid ja alle Super schnelllll :wink:

Zitat:

Zitat von mkinzler
Delphi-Quellcode:
gZahl := (Zahl DIV <schritt> + 1) * <schritt>;

Habe das zuerst versuch und erhalte die Meldung:
E2015 Operator not applicable to this operand type

Delphi-Quellcode:
(var_1 + var_2 div 5 + 1) * 5;

mkinzler 12. Okt 2007 15:35

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Delphi-Quellcode:
gZahl := (Trunc(Zahl) DIV <schritt> + 1) * <schritt>;

Apollonius 12. Okt 2007 15:37

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Nein, denn da kommt für alle Vielfachen von 5 das falsche Ergebnis raus. Ich schlage vor:
Delphi-Quellcode:
gZahl := Ceil(Zahl/<schritt>) * <schritt>;

dominikkv 12. Okt 2007 15:41

Re: Aufrunden auf den nöchsten 5 oder 10er
 
oder
Delphi-Quellcode:
if (((Zahl - Trunc(Zahl)) > 0) or ((Trunc(Zahl) mod 5) > 0)) then
  Zahl := (Trunc(Zahl) div 5 + 1) * 5;

manfred_h 12. Okt 2007 19:37

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Danke für die vielen Vorschläge von Euch allen! :thumb:

Habs mit der Variante von mkinzler gelöst:
Delphi-Quellcode:
gZahl := (Trunc(Zahl) DIV <schritt> + 1) * <schritt>;
Shalom
Manfred

dominikkv 12. Okt 2007 20:27

Re: Aufrunden auf den nöchsten 5 oder 10er
 
der rundet dann aber die 5 zur 10 auf

die beste Methode ist IMHO die von Apollonius:
Delphi-Quellcode:
Zahl := Ceil(Zahl/5) * 5;
Du musst allerdings noch die Unit Math in die uses aufnehmen.
Wenn du das nicht willst kannst du meine Funktion nehmen:
Delphi-Quellcode:
if (((Zahl - Trunc(Zahl)) > 0) or ((Trunc(Zahl) mod 5) > 0)) then
  Zahl := (Trunc(Zahl) div 5 + 1) * 5;
Allerdings funktioniert die nicht mit negativen Zahlen, zB -5,3

Progman 12. Okt 2007 20:33

Re: Aufrunden auf den nöchsten 5 oder 10er
 
warum nehmt ihr nicht einen simplen Vergleich?
Delphi-Quellcode:
if Zahl <= 5 then Ergebnis := 5 else
 if ((Zahl >5) and (Zahl <= 10)) then Ergebnis := 10;

mkinzler 12. Okt 2007 20:34

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Zitat:

Zitat von Progman
warum nehmt ihr nicht einen simplen Vergleich?
Delphi-Quellcode:
if Zahl <= 5 then Ergebnis := 5 else
 if ((Zahl >5) and (Zahl <= 10)) then Ergebnis := 10;

Da es für jedes Vielfaches gelten soll

Progman 12. Okt 2007 20:36

Re: Aufrunden auf den nöchsten 5 oder 10er
 
achso, sorry, aus der Anfangsfrage hatte ich entnommen, dass es nur um Zahlen bis 10 geht ;)

winkelmesser 13. Okt 2007 00:43

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Rein mathematisch

( Ganzzahl ( ( Zahl / 5 ) – 0,01 ) * 5 ) + 5

mfg

Namenloser 13. Okt 2007 01:24

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Wozu -0.01, wenn man fragen darf :gruebel:

winkelmesser 13. Okt 2007 09:22

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Hallo NamenLozer


Um sicherzustellen das bei der Zahl 5.0 es mir den Multiplikator 0 liefert
Denn
5/5 = 1
1 – 0,01 = 0,99 // 0,01 bis max 0,09 bei 1/10 schritten
Ganzzahl von 0,99 = 0

Wie gesagt Rein mathematisch
Getestet mit Excel

mfg

Khabarakh 13. Okt 2007 11:10

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Zitat:

Zitat von winkelmesser
Rein mathematisch

Waren die bisherigen Funktionen also unmathematisch? Ich würde sagen, Apollonius' Version[*] ist sogar noch mathematischer, da sie durch Verwendung der korrekten Funktion (ceiling statt floor) den hässlichen Epsilon-Wert vermeidet.
[*]Dass er es jedoch geschafft hat, das "<schritt>" in den (bzw. zumindest meinen) HTML-Code zu schmuggeln, finde ich etwas beängstigend :gruebel: :stupid: .
Zitat:

Zitat von HTML Tidy
line 865 column 890 - Fehler: element "SCHRITT" undefined


winkelmesser 13. Okt 2007 13:21

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Also mit Rein mathematisch meinte ich nicht das die anderen Lösungsvorschläge NICHT MATHEMATISCH sind sondern das ich keine Delphi Syntax liefern kann weil ich nicht das wissen dafür habe und es mit Microsoft Excel getestet habe.

Ich hoffe das ich niemanden auf die Füße getreten bin und hoffe das auch niemand mir auf die Füße treten will


mfg

DeddyH 13. Okt 2007 13:25

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Zitat:

Zitat von winkelmesser
Ich hoffe das ich niemanden auf die Füße getreten bin und hoffe das auch niemand mir auf die Füße treten will

Mach Dir keine Sorgen, hier entstehen öfter mal (teils hitzige) Diskussionen, bei denen es auch mal verbal "zur Sache geht". Wenn es zu schlimm wird, greifen die Moderatoren ein, außerdem haben sich anschließend eh meist alle "wieder lieb" und trinken ein virtuelles Bier zusammen.

winkelmesser 13. Okt 2007 20:06

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Ein bisschen Code zum testen

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var s : string;
begin
  i := i + 0.1;
  str(I:2:2,S);
  label1.Caption := s;
  x := (Floor(((I/5)-0.01))*5)+5;
  str(x,S);
  label2.Caption := s;
end;
mfg

Khabarakh 13. Okt 2007 21:07

Re: Aufrunden auf den nöchsten 5 oder 10er
 
Zitat:

Zitat von winkelmesser
Also mit Rein mathematisch meinte ich nicht das die anderen Lösungsvorschläge NICHT MATHEMATISCH sind sondern das ich keine Delphi Syntax liefern kann weil ich nicht das wissen dafür habe und es mit Microsoft Excel getestet habe.

Na dann, dein erster Beitrag hat sich eben doch ein wenig die vorherigen, einwandfreien Beiträge missachtend angehört.
Noch ein kleiner Hinweis zu deiner Formel (abgesehen davon, dass du daraus gefahrlos ein paar Klammern entfernen kannst): Einen Epsilon-Wert von 0,01 halte ich eindeutig für zu hoch. Allerdings ist es gar nicht leicht, einen guten Wert dafür auszuwählen, ich würde wohl i * Math.DoubleResolution benutzen[*] (was selbst 5.0000000001 noch richtig umwandeln würde). Da diese Konstante aber gar nicht im interface-Teil deklariert ist, mache ich mir dann doch lieber das Leben etwas leichter ;) und benutze Apollonius' Version, die das ganze Problem elegant umgeht.
[*]Oder natürlich Extended, Hauptsache nicht Single bei solchen Aufgaben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr.

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