![]() |
Rundung bei Verwendung von DisplayFormat
Halli Hallo,
Wir lassen verschiedene Werte die aus einer Datenbank gelesen werden in einem Report anzeigen. Diese Werte sollen mit 2 Nachkommastellen angezeigt werden. Das ist über "DisplayFormat" festgelegt. Wir habe nun das Problem, dass diese Anzeige scheinbar nicht korrekt arbeitet. Um das zu prüfen habe ich die Daten im Report durch eine einzelne Reportvariable ersetzt der ich einen festen Wert zugewiesen habe: z.B. 0.375000000000. Dieser Testwert wird mit dem zweistelligen DisplayFormat als "0,37" angezeigt. Meiner Meinung nach müsste dies aber "0,38" sein, oder liege ich da falsch? Was noch dazu kommt: Auf einem System das zum Test benutzt wird ist ein Windows 2003 Server installiert und dort wird "0,38" als Ergebnis erzeugt. Auf anderen Systemen (Win7, Win2008 Server) ist der angezeigte Wert immer "0,37" Ich habe den gesamten Code kontrolliert ob da irgendwo an den FPU-Einstellungen etwas geändert wird (SetRoundMode oder Set8087CW usw.), was aber nicht der Fall ist. Kann jemand erklären, warum die Anzeige mit "DisplayFormat" nicht korrekt ist und warum sie sich von System zu System unterscheiden kann? Danke schon mal für Tipps oder Hinweise, Ralf |
AW: Rundung bei Verwendung von DisplayFormat
Verschiedene Werte... darf ich raten, ftFloat? Schreib am Besten eine eigene Rundung im GetText. Du wurdest ge-
![]() |
AW: Rundung bei Verwendung von DisplayFormat
Zitat:
Was mich irritiert ist der Umstand, dass sich die slebe Software auf 2 verschiedenen Systemen unterschiedlich verhält. Kann denn eine andere (fremde) Software die gleichzeitig läuft da einen Einfluss ausüben? |
AW: Rundung bei Verwendung von DisplayFormat
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:
Getippt und nicht getestet.
Function RoundToDecimal (aValue, aGranularity : Double);
begin result := (0.500000000001 + Trunc(aValue/aGranularity))*aGranularity; end; 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)'. |
AW: Rundung bei Verwendung von DisplayFormat
Zitat:
|
AW: Rundung bei Verwendung von DisplayFormat
Zitat:
|
AW: Rundung bei Verwendung von DisplayFormat
Zitat:
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. |
AW: Rundung bei Verwendung von DisplayFormat
Zitat:
|
AW: Rundung bei Verwendung von DisplayFormat
Zitat:
|
AW: Rundung bei Verwendung von DisplayFormat
Das muss die Hitze sein :oops::oops::oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 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