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
Scurra

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

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
 
#2

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
Scurra

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

AW: Single runden

  Alt 18. Mär 2015, 19:35
Funktioniert das wirklich?

ShowMessage(FloatToStr(SimpleRoundTo(x2, -4))); Das liefert bei mir 44,9999 (anstatt 45).

Was mir sonst gerade einfällt: Es ist zwar umständlich, aber falls das mit dem Runden einfach nicht klappt, muss man eben "von Hand" runden: Man frägt ab, ob die fürs Runden entscheidende Ziffer (z. B. 5. Ziffer hinter dem Punkt/Komma) eine 1, 2, 3 oder 4 ist, dann soll abgerundet werden, bei 5, 6, 7, 8 oder 9 soll aufgerundet werden und bei 0 soll die Zahl nur abgeschnitten werden. Eine einfachere und elegantere Lösung würde ich bevorzugen

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

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

AW: Single runden

  Alt 18. Mär 2015, 19:42
Funktioniert das wirklich?
Ja:
getestet auf WinXP mit Delphi2007.

Nein:
getestet auf WinXP mit Lazarus.
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
 
#5

AW: Single runden

  Alt 18. Mär 2015, 20:06
Ok, dann bin ich froh, dass es wahrscheinlich nur an Lazarus liegt, dass es bei mir nicht funktioniert. Ich habe mir jetzt einmal genau angeschaut, was SetPrecisionMode und SetRoundMode bedeutet. Für Single funktioniert das ganze vmtl., wenn ich SetPrecisionMode(pmSingle) verwende. Gibt es eine Möglichkeit, abzufragen, ob eine Zahl Single oder Double ist. Ich habe es mit

Delphi-Quellcode:
var
  x1: Single

if x1 is Single then ...
versucht, aber führt zu einem Fehler: Class or interface type expected, but got "Single".

Ansonsten könnte ich wohl auch 2 überladene Versionen der Funktion verwenden:

Delphi-Quellcode:
function(aValue: Single; aPrecision: Integer): Single; overload;
function(aValue: Double; aPrecision: Integer); Double; overload;
Noch eine Frage zum Rundungsmodus rmTruncate: In der Hilfe steht hierzu: Truncates the value, rounding positive numbers down and negative numbers up.

Warum wird dann 44.6 (positive Zahl) auf 45 aufgerundet?

Danke für deine/eure Hilfe!
  Mit Zitat antworten Zitat
BadenPower

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

AW: Single runden

  Alt 18. Mär 2015, 20:56
Noch eine Frage zum Rundungsmodus rmTruncate: In der Hilfe steht hierzu: Truncates the value, rounding positive numbers down and negative numbers up.

Warum wird dann 44.6 (positive Zahl) auf 45 aufgerundet?
Die deutsche Hilfe sagt da aber etwas anderes:
Code:
Schneidet den Wert ab. Positive Werte werden auf-, negative Werte abgerundet.
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
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Single runden

  Alt 18. Mär 2015, 21:02
Ich hatte da auch noch was
http://docwiki.embarcadero.com/RADSt...ositive_Zahlen
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
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