Während der Arbeit mit str() -Funktion fand ich, dass es in einigen Fällen falsch rundet, während round() Funktion wie erwartet funktioniert. Sehen Sie sich das Beispiel an:SQL str() vs Runde() Funktion
declare @v decimal(18,2) = 29.95
select str(@v, 18, 1)
--29.9
select round(@v, 1)
--30.00
set @v = 39.95
select str(@v, 18, 1)
--40.00
select round(@v, 1)
--40.00
Kann jemand erklären, warum es passiert?
EDIT1: I verschiedene Abhilfen mit den folgenden Basiscode geprüft:
declare @v decimal(18,2) = 9.95
declare @r varchar(100)
declare @c int = 1000000
declare @ms int
declare @dt datetime2
set @dt = sysdatetime()
while @c > 0
begin
set @r = --different roundings
set @c = @c - 1
end
set @ms = DATEDIFF(ms, @dt, sysdatetime())
select @ms, @r
Option 1 (der ursprüngliche, rundet fälschlicherweise in einigen Fällen):
str(@v, 18, 1)
Option 2 (leicht modifiziert aber richtig abgerundet):
str(round(@v, 1), 18, 1)
Option 3 (Doppelumwandlung und Rundung):
convert(varchar(20), convert(decimal(18,1), round(@v, 1)))
Option 4 (nur Doppel conversion):
convert(varchar(20), convert(decimal(18,1), @v))
Ergebnisse: Option 1 und 2 sind in etwa 2-mal langsamer als die letzten zwei, aber das Ergebnis ist rechtsbündig. Am schnellsten ist Option 4.
[Was jeder Computer Wissenschaftler sollten über Gleitkommaarithmetik Bescheid wissen (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – GarethD
Vielen Dank! Es ist ein wirklich guter Artikel! –