![]() |
Unterschiedliche Ergebnisse beim Runden
Liste der Anhänge anzeigen (Anzahl: 2)
Hey Community,
ich stehe vor einem Problem, welches ich im Moment nicht verstehe. Ich möchte eine Zahl runden mit folgendem Code
Code:
Der Wert der sich aus der Multiplikation ergibt lautet 7.50000000000728
var i: Int64;
begin [...] i:= Round(zahl*multi); [...] end; Das sollte gerundet 8 ergeben. In i wird allerdings 7 gespeichert. Wenn ich aber den Ausdruck auswerte, erhalte ich 8. Im Anhang sind nochmal zwei Bilder. Mache ich etwas falsch? |
AW: Unterschiedliche Ergebnisse beim Runden
Hallo,
traue diesen "überwachten Ausdrücken" einfach nicht ... Wie oft ich da schon drüber gestolpert bin bei TDateTime. |
AW: Unterschiedliche Ergebnisse beim Runden
In einem neuem Projekt ergibt
Code:
i = 8.
var
i: Int64; begin i:= Round(7.50000000000728); Das soll mal einer verstehen :? |
AW: Unterschiedliche Ergebnisse beim Runden
Es ist auch ein Unterschied zwischen eine Berechnung und einer Konstante.
Welche Typen haben Zahl und Multi? |
AW: Unterschiedliche Ergebnisse beim Runden
Round(FesteGleitkommazahl) ist was anderes als Round(ZahlEinesTyps * ZahlEinesAnderenTyps).
Von welchem Typ sind zahl und multi? Vor dem Aufruf von Round werden die Zahlen, sofern sie von unterschiedlichem Typ sind, in einen "einheitlichen" Typ gewandelt, das kann dann schonmal schiefgehen bzw. nicht zum erwarteten Ergebnis führen. Wenn ich sowas auf die unelegante Art mache, dann sieht das ungefähr so aus:
Delphi-Quellcode:
Dadurch werden ggfls. Integerwerte erstmal in Gleitkomma umgewandelt, damit bei der Berechnung Nachkommastellen erhalten bleiben.
i := Round((zahl + 0.00) * (multi + 0.00));
Das kann so funktionieren, muss aber nicht. Wenns nicht anders geht dann eher sinngemäß sowas:
Delphi-Quellcode:
Und nein, das ist nicht elegant :-(
var i: Int64;
dZahl : Double; dMulti : Double; dGes : Double; begin [...] dZahl := zahl; dMulti := multi; dGes := dZahl * dMulti; i := Round(dGes); [...] end; |
AW: Unterschiedliche Ergebnisse beim Runden
Schau mal in der Hilfe nach, dort wird der Standard-Modus rmNearest beschrieben und zur besseren Erläuterung ein Link zu einem Blog bei Microsoft geteilt.
Zitat:
Grüße Mikhal |
AW: Unterschiedliche Ergebnisse beim Runden
Ich verwende in solchen Fällen immer die Routinen von John Herbster:
![]() Wenn man jetzt ein kleines Testprogramm hätte, das den Fehler reproduziert, dann könnte man auch sehen, ob er damit behoben wird. |
AW: Unterschiedliche Ergebnisse beim Runden
Ein Teil unseres Hauptgeschäfts ist der Finanzbereich, und speziell da gibt es von KundeZuKunde Unterschiede in den Vorgaben, wie die ".5er" Rundungsregel ausfallen soll.
Wir meiden "double" wie der Teufel das Weihwasser, heißt wir rechnen intern eh fast alles selbst mit einem eigenen 48..64Bit FixComma Typen mit eigenen überladenen Operatoren was(seit Delphi2007) problemlos funktioniert. - wir bevorzugen und setzen als Defaulteinstellung für uns bei "exakt .5" die GERADZAHLREGEL. Bei ungenauen 0.5 knapp drüber oder knapp drunter runden wir auf oder ab. - wir bieten eine externe Epsilon Anpassung, um den Bereich des "exakt .5" bei Bedarf selbst passend zu beeinflussen - wir bieten optional auch eine statische Festlegung der Rundungsrichtung bei "exakt .5", also kann ein Kunde wenn er möchte da immer auf oder abrunden - unsere Einstellungen gelten immer programmweit und ohne Beachtung und Kenntnis des Berechnungszwecks... kein Kunde kann sagen er möchte alles fürs eignene Haben aufgerundet und alles fürs eigene Soll abgerundet bekommen... auch wenn mindestens ein Konkurrenzprodukt sowas bietet weigere ich mich das auch so zu programmieren... wie man sieht ist "Rundung" also ein sehr komplexes und teils auch emotionales oder gar rechtlich durchaus relevantes Thema |
AW: Unterschiedliche Ergebnisse beim Runden
ich habe mir mal hiermit beholfen:
Delphi-Quellcode:
Gruß
integer:=trunc(fließkomma+0.5);
K-H |
AW: Unterschiedliche Ergebnisse beim Runden
Also das:
Code:
ist ja mathematisch falsch. Wie kommen die auf die Regel zur nächsten geraden Zahl zu runden?
0.5 rounds to 0
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 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 by Thomas Breitkreuz