Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Individuelles Auf und Abrunden der ersten Nachkommastelle (https://www.delphipraxis.net/183620-individuelles-auf-und-abrunden-der-ersten-nachkommastelle.html)

Delphineuling2015 23. Jan 2015 11:15

Individuelles Auf und Abrunden der ersten Nachkommastelle
 
Hallo zusammen,

ich möchte einen Rechner nachbilden, der als Ergebnis immer nur eine 0 oder eine 5 als erste und einzige Nachkommastelle anzeigt.

Dies bedeutet, dass Zahlen:

1. mit einer 1 als Nachkommastelle auf 0 in der Nachkommastelle aberundet werden (Beispiel: 5,1 soll zu 5,0 oder 5 werden).

2. mit einer 2,3,4,5 und 6 auf 5 in der Nachkommastelle aufgerundet werden (Beispiel: 5,3 soll zu 5,5 werden).

3. mit einer 7,8 und 9 auf eine 0 in der Nachkommastelle abgerundet werden Beispiel: 5,8 soll zu 6,0 oder 6 werden).

Mir fällt leider keine Lösung ein, vielleicht hat ja jemand eine Idee, wie ich es in den nachstehenden Quellcode einbauen kann.

Vielen Dank vorab!!!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c, d, e : Real;
begin
  a := StrToFloat(Edit1.Text);
  b := StrToFloat(Edit2.Text);
  c := StrToFloat(Edit3.Text);
  d := (a * 0.0165) + (b * 0.11) ;
  e := (d / 100) * c ;
  Label1.Caption := FloatToStr(round(e * 10) / 10) +' Punkte';
  Label2.Visible := True

end;

mkinzler 23. Jan 2015 11:23

AW: Individuelles Auf und Abrunden der ersten Nachkommastelle
 
Delphi-Quellcode:
function MyRound( v: Double): Double;
begin
  if Frac( v) < 0.2 then
    result = Trunc(v)
  else if Frac( v) < 0.7 then
    result := Trunc(v) + 0.5 
  else
    result := trunc( v) + 1;
end;

Dejan Vu 23. Jan 2015 11:53

AW: Individuelles Auf und Abrunden der ersten Nachkommastelle
 
Delphi-Quellcode:
Function DvRound (Number,Granularity : double) : double;
begin
  Result := Trunc(Number / Granularity + 0.5) * Granularity
end;

// Aufruf in deinem speziellen Fall (zur Zahl immer 0.1 hinzuaddieren)
DvRound (0.1 + 5.1, 0.5); => 5.0
DvRound (0.1 + 5.2, 0.5); => 5.5
...
DvRound (0.1 + 5.9, 0.5); => 6.0
... andere Möglichkeiten

DvRound (1.7123, 0.1); => 1.7
DvRound (1.7123, 0.01); => 1.71

DvRound (17.7123, 2); => 18
Die Funktion rundet also immer auf das nächste ganzahlige Vielfache der 'Granularity'.

Vermutlich gibt es dafür auch schon eine eingebaute Funktion...

Headbucket 23. Jan 2015 12:23

AW: Individuelles Auf und Abrunden der ersten Nachkommastelle
 
Zitat:

Zitat von mkinzler (Beitrag 1287541)
Delphi-Quellcode:
function MyRound( v: Double): Double;
begin
  if Frac( v) < 0.2 then
    result = Trunc(v)
  else if Frac( v) < 0.7 then
    result := Trunc(v) + 0.5 
  else
    result := trunc( v) + 1;
end;

Es ist noch anzumerken, dass das nur für positive Werte funktioniert.
-3,3 wird hier z.B. auf -2,5 gerundet und nicht auf -3,5.
Außerdem sollte man v vllt am Anfang noch auf eine Nachkommastelle runden.

Aber ich denke Delphineuling2015 wird das Prinzip verstanden haben :-).

Grüße

Delphineuling2015 23. Jan 2015 13:02

AW: Individuelles Auf und Abrunden der ersten Nachkommastelle
 
Hallo zusammen,

erst mal vielen Dank an Euch alle, für die Unterstützung!!!:thumb:

Da ich nach über 15 Jahren "Delphipause" quasi wieder blutiger Anfänger bin, der immer noch mit Version 4 arbeitet:shock:, ist der Groschen, wo mein errechneter Wert in euren Code zum Runden "übergeben" wird, leider noch nicht gefallen.

In meinem Quellcode ist "e" der errechnete Wert. "e" soll nun mit Eurer Funktion gerundet, und dann als
Label1.Caption := FloatToStr(e) +' Punkte';
wieder im Formular angezeigt werden. Ich finde in Eurem Beispiel aber keinen Bezug auf e.

Ihr würdet mir sehr helfen, wenn ihr Euren Code mal in meinen Code einbauen könntet.

Sorry für mein laienhaften Ausdruck, ich arbeite daran :oops:.

BadenPower 23. Jan 2015 15:27

AW: Individuelles Auf und Abrunden der ersten Nachkommastelle
 
Label1.Caption := FloatToStr(MyRound(e)) +' Punkte';

Delphineuling2015 23. Jan 2015 21:30

AW: Individuelles Auf und Abrunden der ersten Nachkommastelle
 
Zitat:

Zitat von BadenPower (Beitrag 1287586)
Label1.Caption := FloatToStr(MyRound(e)) +' Punkte';

Alles klar, jetzt hab ich es gerafft und verstehe auch die Zusammenhänge 8-).

Vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 Uhr.

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