Probleme mit der Round()-Function

29/11/2008 - 00:24 von Carsten Ilwig | Report spam
Hi Leute,

irgendwie verstehe ich die ROND()-Function in SQL nicht richtig.

Ich habe eine Spalte vom Typ Real.
Bei 2 Datensàtzen steht folgender Wert drin:
1. = 6.4400001
2. = 15.36

Wenn ich nun folgendes mache:

select ROUND(marktpreis,2)
from myTable

erhalte ich dies zurück:

1. = 6.4400000000000004
2. = 15.359999999999999

Hàtte mir die Round()-Function die Werte nicht auf 2 Stellen nach dem Komma
runden sollen?
also so:
1. = 6.44
2. = 15.36

Was ist hier falsch?

Vielen Dank für Eure Hilfe
Carsten
 

Lesen sie die antworten

#1 Peter Fleischer
29/11/2008 - 06:26 | Warnen spam
"Carsten Ilwig" schrieb im Newsbeitrag
news:

irgendwie verstehe ich die ROND()-Function in SQL nicht richtig.

Ich habe eine Spalte vom Typ Real.
Bei 2 Datensàtzen steht folgender Wert drin:
1. = 6.4400001
2. = 15.36

Wenn ich nun folgendes mache:

select ROUND(marktpreis,2)
from myTable

erhalte ich dies zurück:

1. = 6.4400000000000004
2. = 15.359999999999999

Hàtte mir die Round()-Function die Werte nicht auf 2 Stellen nach dem
Komma runden sollen?
also so:
1. = 6.44
2. = 15.36

Was ist hier falsch?



Hi Carsten,
falsch ist hier deine Anwendung der Typen, die Konvertierung in
Zeichenketten und die Bewertung des Ergebnisses.

Nicht jeder als Zeichenkette als gebrochene Dezimalzahl dargestellte
endliche Wert làsst sich ohne Verluste in eine endliche binàre Mantisse
konvertieren und zur gleichen Darstellung vom binàren Wert wieder in eine
Zeichenkette zurück verwandeln.

Wenn du beispielsweise ein Drittel mit einer endlichen Genauigkeit als
Dezimalwert mit 2 Stellen nach dem Komma darstellst, dann bekommst du die
gleiche Ungenauigkeit:

3 Mal ein Drittel ergibt 1.

0,33 + 0,33 + 0,33 ergibt 0,99.

Um derartige Differenzen zu unterbinden, solltest du nur mit ganzzahligen
Typen arbeiten, die bei Operationen, die einen gebrochenen Teil ergeben,
bewusst gerundet werden. Ein ganzzahliger Typ mit Positionierung eines
Dezimaltrenners ist beispielsweise auch Decimal bzw. Money. Wenn du doch mit
Gleitkommatypen arbeiten musst, dann solltest du die Rundung nur im letzten
Schritt vor der Konvertierung zur dezimalen Darstellung ausführen, also
direkt vor der Anzeige in der UI.

Viele Grüsse
Peter

Ähnliche fragen