Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Runden auf eine Nachkommastelle (https://www.delphipraxis.net/13634-runden-auf-eine-nachkommastelle.html)

Benedikt1983 22. Dez 2003 23:37


Runden auf eine Nachkommastelle
 
Hallo zusammen!

Ich möchte einen Single-Wert (Gleitkommazahl) auf eine Nachkommastelle runden.

Delphi-Quellcode:
Val(EdDuration.Text, Duration, ErCode);
//Val macht aus einem String eine Zahl. Duration ist eine Single-Variable.
//Bei Fehlern ist ErCode > 0
if (ErCode > 0) then
  Abort
else
 //Duration := RUNDEN!;
Komischerweise ist bei einer Eingabe in EdDuration von z.B. 7.7 der Wert von Duration jetzt 7.6999 usw.
Wie geht das Runden?

Vielen Dank
Benedikt

axelf98 23. Dez 2003 06:50

Re: Runden auf eine Nachkommastelle
 
Delphi-Quellcode:
function runden(Zahl: real): real;
begin
result := trunc(Zahl*10)/10;
end;

Tonic1024 23. Dez 2003 07:41

Re: Runden auf eine Nachkommastelle
 
Moin...

Kommt darauf an, wofür man die Zahl braucht. Trunc rundet immer gegen null (zero). Das bedeutet 4.899999 ergibt glatt 4.8, was definitv falsch ist.

Wenn es für ein reines Abschneiden der Zahl zur Anzeige ist mag das Okay sein, ein runden ist es aber nicht.

Irgendwo habe ich gelesen, dass die Delphi-Funktionen zum runden teilweise einen Schatten haben (nicht immer richtig arbeiten) und da habe ich mir folgendes ausgedacht. Rundet kaufmännisch.

Delphi-Quellcode:
// Stellen default = 0 -> Keine Nachkommastellen!
function Runden(wert: extended; stellen: integer = 0):extended;
var integerWert: integer;
    format: string;
    i: integer;
    temp: string;
begin
  wert:=wert*power(10,stellen);
  if wert > 0 then
  begin
    wert:=wert+0.51;
    SetRoundMode(rmDown); // Art und Weise wie gerundet wird.
  end
  else if wert < 0 then
  begin
    wert:=wert-0.51;
    SetRoundMode(rmUp); // Art und Weise wie gerundet wird.
  end
  else if wert = 0 then
  begin
    SetRoundMode(rmNearest); //Nochmal die Art und Weise.
  end;

  integerwert:=round(wert);

  wert:=integerwert/power(10,stellen);

  if stellen = 0 then
    Format:='#0'
  else
  begin
    for i:=1 to stellen do
    begin
      Format:=Format+'0';
    end;
    Format:='#0.'+Format;
  end;

  temp:=FormatFloat(Format, wert);
  Result:=StrToFloat(temp);
end;
Ist getestet und sollte zuverlässig arbeiten.

[BTW: Wenn jeman einen Fehler entdeckt bin ich durchaus an Verbesserungsvorschlägen interessiert]

bis denne...

Phantom1 23. Dez 2003 07:59

Re: Runden auf eine Nachkommastelle
 
sagt ma ist die Funktion RoundTo() nicht für das runden auf eine bestimmte nachkommmastelle gedacht? :wink:

choose 23. Dez 2003 08:09

Re: Runden auf eine Nachkommastelle
 
Ein Blick in die OH zu RoundTo bestätigt Deinen Verdacht:
Zitat:

Zitat von OH
Die Funktion rundet einen Gleitkommawert [..] auf eine bestimmte Potenz von 10.

Das Tatsächliche Problem konnte in der Speicherung der Fließkommazahlen liegen, das mitunter einige Verwirrung mit sich bringt: Hier im Forum suchenrundungsfehler

Sourcemaker 23. Dez 2003 10:20

Re: Runden auf eine Nachkommastelle
 
Hi,

alternativ mal den Typ Currency verwenden.

Gruß

Frank

Matze 23. Dez 2003 10:30

Re: Runden auf eine Nachkommastelle
 
Geht nicht auch einfach:
Delphi-Quellcode:
Zahl := round(Zahl *10) / 10;

Tonic1024 23. Dez 2003 12:14

Re: Runden auf eine Nachkommastelle
 
Nein, nicht wenns auf Genauigkeit ankommt - frag mal das Finanzamt :lol:. Die Fehler, die mir aufgefallen waren passieren mit der Funktion nicht. Ob ich aber alle gefunden habe kann ich aber nicht sagen. Ist ja immer so eine Sache... :?

Dass Die Funktion so lang ist - sooo lang ist sie ja auch wieder nicht - liegt auch daran, dass sie möglichst universell nutzbar sein sollte...

Kann dir, wie choose schon sagte, nur empfelen hier mal drauf zu klicken...Hier im Forum suchenRundungsfehler


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 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