AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Rundung bei Verwendung von DisplayFormat

Ein Thema von Ralf Kaiser · begonnen am 3. Aug 2015 · letzter Beitrag vom 3. Aug 2015
Antwort Antwort
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: Rundung bei Verwendung von DisplayFormat

  Alt 3. Aug 2015, 17:32
Das Problem ist, das 0.375 nicht exakt darstellbar ist. Mich wundert es zwar, das dies auf unterschiedlichen Systemen unterschiedlich gerundet (bzw. intern dargestellt) wird, aber ich habe Ähnliches vor Jahren erlebt.
(Ziemlich amateurhafte) Abhilfe:
Delphi-Quellcode:
Function RoundToDecimal (aValue, aGranularity : Double);
begin
  result := (0.500000000001 + Trunc(aValue/aGranularity))*aGranularity;
end;
Getippt und nicht getestet.

Bei mir ging es um Cent-Beträge und da hatte mir das gereicht. Aufruf für 2 Nachkommastellen übrigens mit 'RoundToDecimal(value,0.01)'.
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Rundung bei Verwendung von DisplayFormat

  Alt 3. Aug 2015, 17:41
Das Problem ist, das 0.375 nicht exakt darstellbar ist.
Das sollte aber doch bei dem angegebenen Literal "0.375000000000" nicht der Fall sein. Das ist auf 12 Stellen genau angegeben und zeigt trotzdem den Effekt (oder ignoriert Delphi die zusätzlichen Nullen und nimmt an ich hätte "0,375" angegeben (mit der daruas resultierenden Ungenauigkeit)?
Ralf Kaiser
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Rundung bei Verwendung von DisplayFormat

  Alt 3. Aug 2015, 21:32
Das Problem ist, das 0.375 nicht exakt darstellbar ist.
Das sollte aber doch bei dem angegebenen Literal "0.375000000000" nicht der Fall sein.
Das stimmt zufällig, da hast Du Recht. Übrigens auch ohne die '000000'.

Ich war zu sehr auf 0.735 getrimmt.... Wenn das wirklich bei 0.375 so ist, dann ist das wirklich merkwürdig.

Das Einzige, was ich mir vorstellen kann, sind unterschiedliche Rundungsverfahren (Bankers Rounding vs. 'Normal'). Aber das hast Du ja schon gecheckt... Mystisch.

Geändert von Dejan Vu ( 3. Aug 2015 um 21:34 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Rundung bei Verwendung von DisplayFormat

  Alt 3. Aug 2015, 23:03
Nur noch mal um das klar zu stellen, auch wenn es hier glatt darstellbar ist: Es ist völlig egal wie viele Nullen du deinem Literal anhängst. Wenn ein Wert nicht perfekt in einem IEEE Float abgebildet werden kann, kann er es einfach nicht. Egal welche esoterischen Literale einem da noch so einfallen. Geht. Nicht.

(Da der konkrete Wert hier aber exakt darstellbar wäre, muss irgendwo auf dem Weg vom Programm auf den Report-Canvas etwas seltsames passieren.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Rundung bei Verwendung von DisplayFormat

  Alt 3. Aug 2015, 18:08
Das Problem ist, das 0.375 nicht exakt darstellbar ist.
Doch, eigentlich schon:

Single (Hex): 3EC00000
Double (Hex): 3FD8000000000000

0.375 lässt sich auch als 1.5 / 4 schreiben, was zu einem Exponenten von -2 oder normiert 125 bzw. 1021 führt. Die 1 vor dem Komma wird implizit angenommen und die 0.5 lässt sich als Mantisse binär exakt mit einer 1 und vielen Nullen darstellen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:05 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