Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Unterschiedliche Ergebnisse beim Runden (https://www.delphipraxis.net/193551-unterschiedliche-ergebnisse-beim-runden.html)

Uwe Raabe 14. Aug 2017 19:35

AW: Unterschiedliche Ergebnisse beim Runden
 
Zitat:

Zitat von Luckie (Beitrag 1378723)
Wie kommen die auf die Regel zur nächsten geraden Zahl zu runden?

Dieses sogenannte Banker's Rounding soll die Gleichverteilung der Ergebnisse gewährleisten. Andernfalls würde das Aufrunden ja tendenziell bevorzugt. Mit dem Banker's Rounding hält man den Summen-Rundungsfehler statistisch in engeren Grenzen.

Thomas Feichtner 14. Aug 2017 19:37

AW: Unterschiedliche Ergebnisse beim Runden
 
Hallo,

für das kaufmännische Runden verwende ich folgende Funktion:

Delphi-Quellcode:
function xRound(e: Extended; d: Integer ): Extended;
var
  nWert1: Extended;
  nTemp1: Currency;
begin
  { Zuerst Zahl multiplizieren, damit diese als Currency arbeiten kann
    damit bei xRound(2.51 * (100 - 74.5) / 100, 4) = 0.6401 auskommt und nicht
    0.64 }
  // Wenn Grenzwerte überschritten werden, wird geschützt gearbeitet
  if (d>4) or (abs(e)>999999) then begin
    try
      nTemp1 := e * IntPower(10, d - 1);
    except
      Result := e;
      exit;
    end;
  end
  else begin
   nTemp1 := e * IntPower(10, d - 1);
  end;

  if nTemp1 < 0.0 then
    nTemp1 := Trunc(nTemp1 * IntPower(10, 1) - 0.5 ) / IntPower(10, 1)
  else
    nTemp1 := Trunc(nTemp1 * IntPower(10, 1) + 0.5 ) / IntPower(10, 1);
  nWert1 := nTemp1 / IntPower(10, d - 1);
 
  Result := nWert1;
end;

jaenicke 14. Aug 2017 19:41

AW: Unterschiedliche Ergebnisse beim Runden
 
Lustig wird es, wenn man Geräte wie einen Fiskaldrucker ansteuert. Da muss man dann nämlich exakt genauso runden wie der es tut.

Luckie 14. Aug 2017 19:56

AW: Unterschiedliche Ergebnisse beim Runden
 
@Uwe: Danke. Aber ich hätte das mathematische korrekte Runden als Standard gewählt.

Benedikt Magnus 14. Aug 2017 20:51

AW: Unterschiedliche Ergebnisse beim Runden
 
Zitat:

Zitat von Luckie (Beitrag 1378727)
@Uwe: Danke. Aber ich hätte das mathematische korrekte Runden als Standard gewählt.

Dieses merkwürdige Runden ist das "mathematisch korrekte" (was sowieso nur eine Definitionssache darstellt), vor allem im statistischen Bereich ist das sehr wichtig, aber auch überall sonst sorgt es dafür, wie Uwe bereits beschrieben haben, dass die Rundungen in größerem Kontext unverzerrt bleiben.
Das kaufmännische Runden, die Juristen nennen es "Bürgerliches Runden", ist lediglich die einfachere Variante, die dann eingesetzt wird, wenn die Verzerrung durch das häufigere Aufrunden irrelevant ist oder in Kauf genommen wird. Sprich vor allem im kaufmännischen und schulischen Bereich.
Ich muss zugeben, dass ich die mathematisch korrekte Variante vor dem Statistikteil meines Studiums auch nicht kannte. Ist aber auch nicht die einzige mathematische Methode, die man jahrelang "salopp" beigebracht bekommt und erst dann richtig, wenn man sie wirklich braucht. :-D

Luckie 14. Aug 2017 21:55

AW: Unterschiedliche Ergebnisse beim Runden
 
Moment. So habe ich es in der Schule gelernt. Ab 0,5 und drüber wird aufgerundet, da runter abgerundet. Und nicht auf die nächst gerade Zahl.

Eventuell sollten wir Begriffe definieren. Mathematisch, wie oben beschrieben. Kaufmännisch und dieses Bänker runden.

Mathematisch, siehe oben, wie in der Schule gelehrt.

Über diese verschiedenen Rundungsverfahren habe ich mir schon immer den Kopf zerbrochen. :roll:

gammatester 14. Aug 2017 22:12

AW: Unterschiedliche Ergebnisse beim Runden
 
Zitat:

Zitat von Luckie (Beitrag 1378732)
Moment. So habe ich es in der Schule gelernt. Ab 0,5 und drüber wird aufgerundet, da runter abgerundet.

Und wie rundest Du -0.5? Wenn ja, warum?

p80286 14. Aug 2017 22:36

AW: Unterschiedliche Ergebnisse beim Runden
 
Zitat:

Zitat von gammatester (Beitrag 1378734)
Zitat:

Zitat von Luckie (Beitrag 1378732)
Moment. So habe ich es in der Schule gelernt. Ab 0,5 und drüber wird aufgerundet, da runter abgerundet.

Und wie rundest Du -0.5? Wenn ja, warum?

-0.5=0.5*-1 also 1*-1

Gruß
K-H

himitsu 15. Aug 2017 03:36

AW: Unterschiedliche Ergebnisse beim Runden
 
Zitat:

Zitat von Luckie (Beitrag 1378727)
@Uwe: Danke. Aber ich hätte das mathematische korrekte Runden als Standard gewählt.

Das kannst du bei dir ja gern machen.

Delphi-Referenz durchsuchenGet8087CW
Delphi-Referenz durchsuchenSet8087CW
Delphi-Referenz durchsuchenGetRoundMode
Delphi-Referenz durchsuchenSetRoundMode

8086 = CPU (central processing unit)
8087 = FPU (floating point unit)
GPU (graphics processing unit) .... uhhh, Codename "Pascal" für nvidia GeForce 1000er Serie (GeForce GTX 1060, ...)
Southbridge, Northbridge, Soundcard usw.
Damals waren das noch einzelne Chips, aber Heute ist das ja oft nur noch ein Chip.


Bei 7.50000000000728 muß man eben aufpassen, ob es auch in die Variable passt, bevor es gerundet wird und auch nach dem Runden.
Wenn es nur das mathematische Ergebnis ist, aber der Typ das nur als 7.499999998 speichert, dann wird da eventuell anders gerundet.
Also in einem Single sollte der Wert schonmal nicht gespeichert werden, da dort nicht genug signifikante Dezimalstellen existieren.

Ritsch 15. Aug 2017 06:59

AW: Unterschiedliche Ergebnisse beim Runden
 
Danke für eure zahlreichen Antworten.
Habe es jetzt folgendermaßen gelöst.

Anstatt
Code:
var i: Int64;
begin
[...]
  i:= Round(zahl*multi);
[...]
end;
so
Code:
var i: Int64;
    d: double;
begin
  [...]
  d:= zahl * multi;
  i:= Round(d);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 Uhr.
Seite 2 von 4     12 34      

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