Post by Christian DonnerBei anderen Datentypen kann man die Zahl in einen String umwandeln und den
@strAblage))
Dummerweise hast Du mit FLOAT den wahrscheinlich schlechtesten aller
möglichen numerischen Datentypen für Dein Beispiel gewählt. Dein Statement
liefert inkorrekte Ergebnisse. ;-)
Offensichtlich sollte als Ergebnis eine 6 zurückkommen, da @v1 ebendiese
Anzahl an Nachkommastellen hat. Durch die Konvertierung von FLOAT in VARCHAR
findet intern eine Rundung statt, die teilweise signifikante Nachkommastellen
"abschneidet" und standardmäßig auch nur mit 6 Nachkommastellen gearbeitet
wird. Dies ist "by Design" ist und kann manchmal ziemlich ärgerlich sein.
Jedenfalls führt dies dazu, daß Dein Statement 5 als Anzahl der
Nachkommastellen zurückgibt.
Es gibt aber einen einfachen Workaround hierfür:
DECLARE @v1 FLOAT
SET @v1 = 3.141529
SELECT
LTRIM(CAST(@v1 - CAST(@v1 AS INT )AS FLOAT )) AS Fractional_Part
, RIGHT(LTRIM(@v1 - CAST(@v1 AS INT)),LEN(@v1)-CHARINDEX('.', @v1)+1) AS
Decimal_Places
, LEN(RIGHT(LTRIM(@v1 - CAST(@v1 AS INT)),LEN(@v1)-CHARINDEX('.', @v1)+1))
AS Len_of_Decimal_Places
Fractional_Part Decimal_Places Len_of_Decimal_Places
---------------------- ---------------------- ---------------------
0.141529 141529 6
(1 row(s) affected)
Diese Konvertierung ist ziemlich statisch und wird zunehmend kniffliger,
wenn die Anzahl der Nachkommastellen über 10 hinausgeht.
Generell mal ganz abgesehen davon, das sich mir im Moment der Sinn dieser
Frage hier nicht vollkommen erschließt. :-O
--
Frank Kalis
Microsoft SQL Server MVP
http://www.insidesql.de
Ich unterstütze PASS Deutschland e.V. (http://www.sqlpass.de)