![]() |
AW: !!Riesenprobelm mit Datentypen!!
Zitat:
|
AW: Genauigkeit von Datentypen
Geld ist ja ein bisschen ein Spezialfall, da es scheinbar gebrochene Werte sind, aber eigentlich gibt es eine diskrete Einheit z.B. 1 Cent.
Bei den meisten physikalischen Größen wie Geschwindigkeit, Masse, usw. hat man oft denn Fall, dass die Eingabewerte eine viel geringere Messgenauigkeit haben als die Ungenauigkeit der Gleitkommazahlen. Ansonsten ist das korrekte Umgehen mit numerische Ungenauigkeiten eine nicht triviale Aufgabe und wird häufig einfach ignoriert :mrgreen: |
AW: Genauigkeit von Datentypen
Einen netten Überblick zum Thema Genauigkeit von Gleitkommazahlen gibt
![]() Das Rechnen mit Geld hat auch Tücken trotz fester kleiner Einheiten, also z.B. 1 Cent. Nämlich dann wenn z.B. Mehrwertsteuer ins Spiel kommt. Wo dann eben wiederum kleinere Werte als die genannten Einheiten auftreten. |
AW: !!Riesenprobelm mit Datentypen!!
Zitat:
|
AW: Genauigkeit von Datentypen
Zitat:
Delphi-Quellcode:
oder
if SameValue(arGeld[i], 2, 0.005) then
Delphi-Quellcode:
if CompareValue(arGeld[i], 2, 0.005) = EqualsValue then
|
AW: Genauigkeit von Datentypen
Delphi-Quellcode:
Das Epsilon kann ein beliebiger Wert sein, der den maximalen Unterschied angibt, bei dem die Wert noch gleich sind.
var
Val1, Val2 : Double; if CompareValue( Val1, Val2 {, Epsilon} ) then ShowMessage( 'Sind Gleich' ); Aber warum willst du das Programm überhaupt von
Delphi-Quellcode:
auf
Currency
Delphi-Quellcode:
umstellen? Macht bei Währungsbeträgen doch Null Sinn.
Double
|
AW: Genauigkeit von Datentypen
Und wenn man die 0.005 weg lässt, dann wird automatisch ein typspezifischer Wert genommen.
Delphi-Quellcode:
const
FuzzFactor = 1000; ExtendedResolution = 1E-19 * FuzzFactor; DoubleResolution = 1E-15 * FuzzFactor; SingleResolution = 1E-7 * FuzzFactor; function SameValue(const A, B: Extended; Epsilon: Extended): Boolean; begin if Epsilon = 0 then Epsilon := Max(Min(Abs(A), Abs(B)) * ExtendedResolution, ExtendedResolution); ... end; function IsZero(const A: Extended; Epsilon: Extended): Boolean; begin if Epsilon = 0 then Epsilon := ExtendedResolution; ... end; |
AW: Genauigkeit von Datentypen
Zitat:
|
AW: Genauigkeit von Datentypen
Ob es Sinn macht, statt Double Currency zu verwenden muss wohl jeder für sich selber entscheiden. Es kommt auf den Einzelfall an. Wenn z.B. ein Preis aus Menge mit bis zu 3 Nachkommastellen, Rabatt mit zwei Nachkommastellen, oder sogenannten Multi's wie sie bei Datanorm verwendet werden mit 3 Nachkommastellen....usw. berechnet werden muss, dann muss man Double und Currency mischen. Das ist auch nicht der Hit und darum kann es eleganter sein, die Doubles entsprechend zu behandeln.
Zitat:
Delphi-Quellcode:
function GleicherBetrag(D1, D2: double): boolean;
begin Result := SameValue(D1, D2, 0.011); end; |
AW: Genauigkeit von Datentypen
Muss?
Currency = 4 Nachkommastellen Bei Epsilon=0.011 ist 0.01 = 0.02 . Epsilon muß kleiner als die Hälfte der kleinsten erlaubten Differenz sein, um "sicher" vergleichen zu können. Wenn A=3, B=4 und Epsilon=>0.5, dann würde 3.5 verglichen mit A und B jeweils "gleich" sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 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