Thema: Delphi Single runden

Einzelnen Beitrag anzeigen

Scurra

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

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