![]() |
Runden auf eine Nachkommastelle
Hallo zusammen!
Ich möchte einen Single-Wert (Gleitkommazahl) auf eine Nachkommastelle runden.
Delphi-Quellcode:
Komischerweise ist bei einer Eingabe in EdDuration von z.B. 7.7 der Wert von Duration jetzt 7.6999 usw.
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!; Wie geht das Runden? Vielen Dank Benedikt |
Re: Runden auf eine Nachkommastelle
Delphi-Quellcode:
function runden(Zahl: real): real;
begin result := trunc(Zahl*10)/10; end; |
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:
Ist getestet und sollte zuverlässig arbeiten.
// 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; [BTW: Wenn jeman einen Fehler entdeckt bin ich durchaus an Verbesserungsvorschlägen interessiert] bis denne... |
Re: Runden auf eine Nachkommastelle
sagt ma ist die Funktion RoundTo() nicht für das runden auf eine bestimmte nachkommmastelle gedacht? :wink:
|
Re: Runden auf eine Nachkommastelle
Ein Blick in die OH zu RoundTo bestätigt Deinen Verdacht:
Zitat:
![]() |
Re: Runden auf eine Nachkommastelle
Hi,
alternativ mal den Typ Currency verwenden. Gruß Frank |
Re: Runden auf eine Nachkommastelle
Geht nicht auch einfach:
Delphi-Quellcode:
Zahl := round(Zahl *10) / 10;
|
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... ![]() |
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