AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Runden auf eine Nachkommastelle

Ein Thema von Benedikt1983 · begonnen am 22. Dez 2003 · letzter Beitrag vom 23. Dez 2003
Antwort Antwort
Benedikt1983

Registriert seit: 12. Dez 2003
37 Beiträge
 
#1

Runden auf eine Nachkommastelle

  Alt 22. Dez 2003, 23:37
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
  Mit Zitat antworten Zitat
axelf98

Registriert seit: 27. Aug 2003
Ort: Ennepetal
440 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Runden auf eine Nachkommastelle

  Alt 23. Dez 2003, 06:50
Delphi-Quellcode:
function runden(Zahl: real): real;
begin
result := trunc(Zahl*10)/10;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#3

Re: Runden auf eine Nachkommastelle

  Alt 23. Dez 2003, 07:41
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...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Runden auf eine Nachkommastelle

  Alt 23. Dez 2003, 07:59
sagt ma ist die Funktion RoundTo() nicht für das runden auf eine bestimmte nachkommmastelle gedacht?
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#5

Re: Runden auf eine Nachkommastelle

  Alt 23. Dez 2003, 08:09
Ein Blick in die OH zu RoundTo bestätigt Deinen Verdacht:
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
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Sourcemaker
Sourcemaker

Registriert seit: 3. Sep 2003
Ort: Westoverledingen
264 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Runden auf eine Nachkommastelle

  Alt 23. Dez 2003, 10:20
Hi,

alternativ mal den Typ Currency verwenden.

Gruß

Frank
Frank
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Runden auf eine Nachkommastelle

  Alt 23. Dez 2003, 10:30
Geht nicht auch einfach:
Zahl := round(Zahl *10) / 10;
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#8

Re: Runden auf eine Nachkommastelle

  Alt 23. Dez 2003, 12:14
Nein, nicht wenns auf Genauigkeit ankommt - frag mal das Finanzamt . 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
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 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