AGB  ·  Datenschutz  ·  Impressum  







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

Unterschiedliche Ergebnisse beim Runden

Ein Thema von Ritsch · begonnen am 14. Aug 2017 · letzter Beitrag vom 21. Aug 2017
Antwort Antwort
Benutzerbild von Ritsch
Ritsch

Registriert seit: 15. Apr 2014
Ort: Wolfenbüttel
33 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Unterschiedliche Ergebnisse beim Runden

  Alt 14. Aug 2017, 15:59
Hey Community,

ich stehe vor einem Problem, welches ich im Moment nicht verstehe.

Ich möchte eine Zahl runden mit folgendem Code

Code:
var i: Int64;
begin
[...]
  i:= Round(zahl*multi);
[...]
end;
Der Wert der sich aus der Multiplikation ergibt lautet 7.50000000000728
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?
Angehängte Grafiken
Dateityp: png Bild1.png (18,3 KB, 44x aufgerufen)
Dateityp: png Bild2.png (20,5 KB, 43x aufgerufen)
Richard
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Unterschiedliche Ergebnisse beim Runden

  Alt 14. Aug 2017, 16:03
Hallo,
traue diesen "überwachten Ausdrücken" einfach nicht ...
Wie oft ich da schon drüber gestolpert bin bei TDateTime.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Ritsch
Ritsch

Registriert seit: 15. Apr 2014
Ort: Wolfenbüttel
33 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Unterschiedliche Ergebnisse beim Runden

  Alt 14. Aug 2017, 16:07
In einem neuem Projekt ergibt

Code:
var
  i: Int64;
begin
  i:= Round(7.50000000000728);
i = 8.

Das soll mal einer verstehen
Richard
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.868 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Unterschiedliche Ergebnisse beim Runden

  Alt 14. Aug 2017, 16:19
Es ist auch ein Unterschied zwischen eine Berechnung und einer Konstante.

Welche Typen haben Zahl und Multi?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Unterschiedliche Ergebnisse beim Runden

  Alt 14. Aug 2017, 16:36
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:
The Round function goes to the nearest integer, and if there are two nearest integers then it goes to the even one. 1.5 rounds to 2, 0.5 rounds to 0
Dein 7,5 ist mit 8 korrekt, wenn dein Ergebnis aber 6,5 wäre, dann wäre demnach 6 korrekt - eben die nächste gerade Ganzzahl.

Grüße
Mikhal
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.602 Beiträge
 
Delphi 12 Athens
 
#6

AW: Unterschiedliche Ergebnisse beim Runden

  Alt 14. Aug 2017, 16:46
Ich verwende in solchen Fällen immer die Routinen von John Herbster: ID: 21909, DecimalRounding (JH1).

Wenn man jetzt ein kleines Testprogramm hätte, das den Fehler reproduziert, dann könnte man auch sehen, ob er damit behoben wird.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Unterschiedliche Ergebnisse beim Runden

  Alt 14. Aug 2017, 16:25
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:i := Round((zahl + 0.00) * (multi + 0.00)); Dadurch werden ggfls. Integerwerte erstmal in Gleitkomma umgewandelt, damit bei der Berechnung Nachkommastellen erhalten bleiben.

Das kann so funktionieren, muss aber nicht.

Wenns nicht anders geht dann eher sinngemäß sowas:
Delphi-Quellcode:
var i: Int64;
    dZahl : Double;
    dMulti : Double;
    dGes : Double;
begin
[...]
  dZahl := zahl;
  dMulti := multi;
  dGes := dZahl * dMulti;
  i := Round(dGes);
[...]
end;
Und nein, das ist nicht elegant

Geändert von nahpets (14. Aug 2017 um 16:51 Uhr) Grund: Schreibfehler :-(
  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:43 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