AW: Unterschiedliche Ergebnisse beim Runden
Zitat:
|
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; |
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.
|
AW: Unterschiedliche Ergebnisse beim Runden
@Uwe: Danke. Aber ich hätte das mathematische korrekte Runden als Standard gewählt.
|
AW: Unterschiedliche Ergebnisse beim Runden
Zitat:
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 |
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: |
AW: Unterschiedliche Ergebnisse beim Runden
Zitat:
|
AW: Unterschiedliche Ergebnisse beim Runden
Zitat:
Gruß K-H |
AW: Unterschiedliche Ergebnisse beim Runden
Zitat:
Get8087CW Set8087CW GetRoundMode SetRoundMode 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. |
AW: Unterschiedliche Ergebnisse beim Runden
Danke für eure zahlreichen Antworten.
Habe es jetzt folgendermaßen gelöst. Anstatt
Code:
so
var i: Int64;
begin [...] i:= Round(zahl*multi); [...] end;
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. |
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