AGB  ·  Datenschutz  ·  Impressum  







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

Single runden

Ein Thema von Scurra · begonnen am 18. Mär 2015 · letzter Beitrag vom 22. Mär 2015
Antwort Antwort
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#1

AW: Single runden

  Alt 18. Mär 2015, 15:07
Du vermischt zwei verschiedene Aspekte beim Runden: 2.5 ist exakt als single darstellbar! Aber es wird round-to-even benutzt und deshalb nicht auf die ungerade 3 aufgerundet sondern auf die gerade 2 abgerundet. 3.5 ist auch exakt darstellbar, wird aber auf 4 gerundet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#2

AW: Single runden

  Alt 18. Mär 2015, 15:28
Delphi-Referenz durchsuchenRoundTo?


Den Datentypen Extended solltest du besser nicht verwenden.
Reicht Double denn wirklich nicht aus?


http://docwiki.embarcadero.com/RADSt...eitkommawerten
http://docwiki.embarcadero.com/RADSt...e_%28Delphi%29
http://docwiki.embarcadero.com/Libra...ystem.Extended
http://docwiki.embarcadero.com/RADSt...e_Datenformate -> Auf der 64-Bit-Intel-Plattform und ARM-Platform ist der Typ Extended ein Alias für den Typ Double ...
http://docwiki.embarcadero.com/RADSt...ommaarithmetik
http://docwiki.embarcadero.com/RADSt...d_%28Delphi%29
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#3

AW: Single runden

  Alt 18. Mär 2015, 15:33
SimpleRoundTo()

Dann braucht er nicht noch SetRoundMode, wenn er kaufmännisch runden will.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Scurra

Registriert seit: 19. Jan 2015
81 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Single runden

  Alt 18. Mär 2015, 17:39
Zitat:
Exaktes Runden ist übrigens ein Klasse Oxymoron.
Ich hätte wohl besser "richtiges Runden" schreiben sollen

Ok, dann ist es wohl besser, wenn ich Double verwende. Diese Genauigkeit genügt mir eigentlich auch schon. Das Runden sollte am besten für Single und Double gleiche Ergebnisse liefern. Gemäß dem obersten Link ist SimpleRoundTo genau die Funktion, die ich haben möchte.

Allerdings gibt es auch hier ein für mich unerwünschtes Verhalten (siehe die jeweiligen Ergebnisse als Kommentar):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  x1: Single;
  x2: Double;
  y1: Single;
  y2: Double;
begin
  x1 := 44.99995;
  x2 := 44.99995;
  ShowMessage(FloatToStr(SimpleRoundTo(x1, -4))); // liefert 45
  ShowMessage(FloatToStr(SimpleRoundTo(x2, -4))); // liefert 44.9999

  y1 := 4.99995;
  y2 := 4.99995;
  ShowMessage(FloatToStr(SimpleRoundTo(y1, -4))); // liefert 4.999899864
  ShowMessage(FloatToStr(SimpleRoundTo(y2, -4))); // liefert 5
end;
Oder liegt das nur daran, dass ich es von zu Hause aus gerade nicht mit Delphi testen kann, sondern nur mit Lazarus?

Zitat:
Du vermischt zwei verschiedene Aspekte beim Runden: 2.5 ist exakt als single darstellbar! Aber es wird round-to-even benutzt und deshalb nicht auf die ungerade 3 aufgerundet sondern auf die gerade 2 abgerundet. 3.5 ist auch exakt darstellbar, wird aber auf 4 gerundet.
Ich sehe zwar in meinem Code nicht so etwas wie round-to-even, aber sollte dann 49.99995 nicht erst recht auf 45 gerundet werden, wenn man auf 4 Nachkommastellen rundet (9.5 wird zur geraden Zahl, also zu 10 gerunden)?

Danke schon einmal für eure Hilfe. Bisher waren mir nur die Rundungsfunktionen wie Trunc, Ceil und Round bekannt. Beim googlen bin ich fast nur auf Beiträge gestoßen, wo das kaufmännische Runden selbst in Funktionen implementiert wurde. Das wundert mich, wenn es doch schon bereitgestellte Funktionen dafür gibt.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Single runden

  Alt 18. Mär 2015, 17:47
Ich stell mal die entscheidende Frage:

Der Wert der da herauskommt hat welche Bedeutung? Etwa ein Währungsbetrag?

Dann bist du mit deiner Rechnerei eh auf dem Holzweg, denn der Wert sollte dann final vom Typ Currency sein.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Scurra

Registriert seit: 19. Jan 2015
81 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Single runden

  Alt 18. Mär 2015, 18:17
Zitat:
Der Wert der da herauskommt hat welche Bedeutung?
Ich habe ein Dokument, in dem sich Formen (Rechtecke, Bilder o. ä.) befinden. Ich möchte beispielsweise die Positionen der Formen oder die Seitenränder (z. B. in cm) o. ä. speichern und später wieder abrufen können. Da die Werte, die ich auslesen kann, aber immer x-Stellen lang sind und ich nicht so eine hohe Genauigkeit brauche, runde ich die Zahlen lieber.

Natürlich sollte immer nach der gleichen Vorschrift gerundet werden, aber solche Grenzfälle mit .5 bestehen meistens (meistens wird wohl auch bei .5 nach meiner Erwartung gerundet) meine Testcases... Dass da etwas nicht richtig funktioniert, ist mir aber erst durch Testcases (mit dUnit) aufgefallen.

Geändert von Scurra (18. Mär 2015 um 18:19 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#7

AW: Single runden

  Alt 18. Mär 2015, 19:15
Wenn Dir ein Double reicht, dann kannst Du folgendes machen, um die richtigen gerundeten Werte zu erhalten:

Delphi-Quellcode:
var
  x2: Double;
  y2: Double;
begin
  SetPrecisionMode(pmDouble);
  SetRoundMode(rmTruncate);

  x2 := 44.99995;
  y2 := 4.99995;

  ShowMessage(FloatToStr(SimpleRoundTo(x2, -4)));
  ShowMessage(FloatToStr(SimpleRoundTo(y2, -4)));
end;
Deine Gleitkomma-Variablen müssen allerdings vom Typ Double sein.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  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 03:59 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