AGB  ·  Datenschutz  ·  Impressum  







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

Rundungsproblem in Delphi

Ein Thema von norwegen60 · begonnen am 27. Jan 2025 · letzter Beitrag vom 29. Jan 2025
Antwort Antwort
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.371 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Rundungsproblem in Delphi

  Alt 28. Jan 2025, 05:16
Entgegen der allgemeinen Vorstellung, dass Trunc wirklich einfach abschneidet, rundet Trunc gegen "0". Bei unglücklicher Konstellation kann es dann zu solchen Phänomenen kommen.
Zum besseren Verständnis siehe diesen Beitrag
Peter
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.432 Beiträge
 
Delphi 12 Athens
 
#2

AW: Rundungsproblem in Delphi

  Alt 28. Jan 2025, 05:51
Hallöle...
Zitat:
Ich verwende folgenden Algorithmus zum Runden
Was spricht gegen RoundTo oder SimpleRoundTo?

Zitat aus docwiki:
"SimpleRoundTo ist das herkömmliche "Abrunden", das in der Schule gelernt wurde."

Erklärung:
https://mathiaspannier.wordpress.com...simpleroundto/
https://docwiki.embarcadero.com/RADS...eitkommawerten

Zitat:
dass immer korrekt gerundet wird
...was ist für dich korrekt? (siehe Beispiele im docwiki)

Geändert von haentschman (28. Jan 2025 um 06:32 Uhr)
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
514 Beiträge
 
Delphi 12 Athens
 
#3

AW: Rundungsproblem in Delphi

  Alt 28. Jan 2025, 08:02
Hallo zusammen,

danke fürs Feedback.

Zunächst muss ich sagen, dass mein Problem gelöst zu sein scheint. Ich habe auch in der Funktion die beiden Deklarationen Faktor, Wert: extended; auf Real gesetzt. Hatte den Code hier aus DP kopiert und nur die Eingangsparameter an meine Werte angepasst.
Trotzdem bin ich verwundert, dass sowohl in "Überwachte Ausdrücke" als auch wenn ich mit der Maus auf Wert fahre, genau 184133 angezeigt wird. Also keinerlei Kommastellen. Trotzdem kommt im Integer nach Trunc 184132 an

Entgegen der allgemeinen Vorstellung, dass Trunc wirklich einfach abschneidet, rundet Trunc gegen "0".
Wie oben beschrieben, gibt es bei der Zahl, zumindest wenn ich auf die Anzeige schaue, nichts mehr zu runden. Ich hatte ja zuvor 184132.5 + 0.5 gerechnet. Der Trunc soll also nur noch die Zahl in eine Integer verwandeln. Tut er auch, aber eben 184132, also 1 zu niedrig

Was spricht gegen RoundTo oder SimpleRoundTo?
Dass dort die übergebene 185.1325 auch auf 184.132 abgerundet wird. Wie gesagt tritt das Problem nur auf, wenn ich die Zahl zuvor per TryStrToFloat aus einem String umgewandelt habe.

Und in meinem Code multipliziere ich die Zahl ja sogar noch, sogar die gewünschten Stellen komplett ganze Zahlen sind und addiere dann noch 0.5 dazu. Trotzdem wird zum Schluss wieder abgerundet. Damit ist die Ganz-Zahl ja schon genau das, was ich will.

Gewünscht ist eine kaufmännische Rundung. D.h. 184.1325 ergibt bei 3 Stellen 184.133 und 184.13249999 ergibt 184.132
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.371 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Rundungsproblem in Delphi

  Alt 28. Jan 2025, 09:14
Entgegen der allgemeinen Vorstellung, dass Trunc wirklich einfach abschneidet, rundet Trunc gegen "0".
Wie oben beschrieben, gibt es bei der Zahl, zumindest wenn ich auf die Anzeige schaue, nichts mehr zu runden. Ich hatte ja zuvor 184132.5 + 0.5 gerechnet. Der Trunc soll also nur noch die Zahl in eine Integer verwandeln. Tut er auch, aber eben 184132, also 1 zu niedrig
Die Anzeige lügt. Dort werden gerundete Werte angezeigt.
Hast du dir den Link angesehen? Dort wird nahezu das gleiche Problem dargestellt und Lösungen sind dort auch.
Peter
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
514 Beiträge
 
Delphi 12 Athens
 
#5

AW: Rundungsproblem in Delphi

  Alt 28. Jan 2025, 13:55
Die Anzeige lügt. Dort werden gerundete Werte angezeigt.


Aber jetzt habe ich hoffentlich wieder in Normalmodus geschalten. Hätte schon vorher passieren müssen. TRUNC schneidet ja nur ab => 184132.999999999999999999999999 wird zu 184132

Werden jetzt in die Formel noch Round(184132.9999) setzen und bin dann hoffentlich auf der sicheren Seite.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.371 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Rundungsproblem in Delphi

  Alt 28. Jan 2025, 14:28
Leider bist du damit auch nicht auf der sicheren Seite.

Round verwendet das sogenannte Bankers Rounding. Dabei wird 3,5 zu 4 gerunden. Allerdings 4,5 auch zu 4.
Das Prinzip dahinter: Bei x,5 wird zur nächsten geraden Zahl gerundet.

Du brauchst SimpleRoundTo. Das müsste in der Unit System.Math stehen. Könnte bei D7 aber auch anders sein
SimpleRoundTo macht es so, wie es bei uns in der Schule gelehrt wird. Bei x.5 wird aufgerundet. Und das passt dann auch zu deiner Anforderung.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.432 Beiträge
 
Delphi 12 Athens
 
#7

AW: Rundungsproblem in Delphi

  Alt 28. Jan 2025, 14:41
D7

ChatGPT sagt SimpleRoundTo für D7:
Zitat:
Ja, Delphi 7 enthält bereits die Unit Math, jedoch die Funktion SimpleRoundTo wurde erst später in Delphi 2006 (Borland Developer Studio 2006) eingeführt.
ungetestet:
Delphi-Quellcode:
// Beispielimplementierung von SimpleRoundTo in Delphi 7
function SimpleRoundTo(const AValue: Extended; const ADigit: Integer): Extended;
var
  Factor: Extended;
begin
  Factor := IntPower(10, ADigit);
  Result := Round(AValue * Factor) / Factor;
end;
Original D12:
Delphi-Quellcode:
function SimpleRoundTo(const AValue: Extended; const ADigit: TRoundToRange = -2): Extended;
var
  LFactor: Extended;
begin
  LFactor := IntPower(10.0, ADigit);
  if AValue < 0 then
    Result := Int((AValue / LFactor) - 0.5) * LFactor
  else
    Result := Int((AValue / LFactor) + 0.5) * LFactor;
end;

Geändert von haentschman (28. Jan 2025 um 14:47 Uhr)
  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 02:46 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