Rundung Problem mit SQL-Server und REAL-Datentyp
Ich sehe etwas seltsames Verhalten beim Runden in SQL Server 2008. Die folgenden code:
DECLARE @Value REAL
SELECT @Value = .35
SELECT ROUND(@Value, 1)
Ich würde erwarten, dass der Wert zu sein, .4, jedoch gibt es .3. Ich muss davon ausgehen, ist dies, weil der Wert gespeichert ist eigentlich weniger als .35, etwas wie .34999999999999. Ist dies der Fall, oder mache ich etwas falsch? Gibt es eine Möglichkeit, dies zu gewährleisten, verhält sich wie erwartet, zumindest von den sichtbaren Wert?
- Was bekommen Sie, wenn
@Value
ist der TypDECIMAL(10,2)
? Denken Sie daran, dassREAL
ist der Ungefähre Daten-Typ, was bedeutet, es kann ja speichern .35 als .34999999999999 oder etwas ähnliches. - Mit einem DECIMAL(10,2) gibt das erwartete Ergebnis. Leider, meine Datenbank ist schon mit ECHTEN dafür. Vielleicht muss ich schauen bei der Umwandlung.
- Ja, ich würde vorschlagen, Sie zu konvertieren.
REAL
undFLOAT
sind nicht die Daten geben, die Sie verwenden sollten, wenn Sie erwarten, logisch (z.B. mehr annähernd als das, was die Wissenschaft lehrt, Sie) Rundung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du mit floating-point-Werte wie REAL und FLOAT (gleiche Sache), die SQL Server-ROUND () - Funktion folgt IEEE-Standard 754 und nutzt die "round up" Algorithmus.
Aber, dass bedeutet, verschiedene Dinge für verschiedene floating-point-Werte. Einige ".5" - Werte am Ende immer so gespeichert, wie eine Annäherung an ".49999999999", andere als ".500000001", etc. Es rundet den Wert, der gespeichert wird, nicht der Wert, den Sie ihm gegeben, um mit zu beginnen.
http://msdn.microsoft.com/en-us/library/ms187912.aspx
Wenn die genauen dezimal-Mathematik für Sie wichtig ist, verwenden Sie DECIMAL, nicht FLOAT oder REAL ist.
Es ist schade, dass die Daten gespeichert werden, als REAL, aber nicht alle Hoffnung ist verloren. Konvertieren Sie die REAL DECIMAL(10,2) vor dem Runden. So werden die 0.3499999999999 (oder was auch immer ungenauer Wert gespeichert wird) gerundet werden, um .35, und dann wirst du die Runde, dass bis 0,4. Sie können sogar konvertieren Sie das er-Ergebnis DECIMAL(10,1), wenn Sie angezeigt werden soll als
0.4
: