2011-07-08 15 views
9

MSDN mówi o precyzji i scale of decimal multiplicatuion result:T SQL dziesiętny mnożenia

  • Dokładność wyników oraz podziałce bezwzględnego maksimum 38. Po precyzyjnym wynik jest większy niż 38, odpowiednia waga zmniejsza się do zapobiec obcięciu części integralnej wyniku.

Więc kiedy wykonujemy to:

DECLARE @a DECIMAL(18,9) 
DECLARE @b DECIMAL(19,9) 

set @a = 1.123456789 
set @b = 1 

SELECT @a * @b 

wynik jest 1.12345689000000000 (9 zer) i widzimy, że to nie jest obcięty, ponieważ 18 + 19 + 1 = 38 (do limitu).

Kiedy podnosimy dokładność @a do 27, tracimy wszystkie zera, a wynik to zaledwie 1.123456789. Idąc dalej, kontynuujemy obcinanie i uzyskujemy wynik zaokrąglenia. Na przykład zwiększenie precyzji @a do 28 daje 1,12345679 (8 cyfr).

Interesujące jest to, że w pewnym momencie, z precyzją równą 30, mamy 1.123457 i wynik ten nie zmieni się dalej (przestaje być obcięty).

31, 32 i do 38 wyników w tym samym. Jak to wyjaśnić?

+0

Po prostu wpadłem na pomysł: może to zrobić, aby użytkownicy nie utracili swoich dziesiętnych znaków (cyfr po przecinku) całkowicie, gdy użyli funkcji sum(). Zawsze zwraca dziesiętny (38, s) i nie daje żadnego adekwatnego wyniku (w sensie uzyskania wartości niecałkowitej) po pomnożeniu na dowolnym dziesiętnym z tym samym niezerowym s (lub nawet s-1, gdy s> = 2). Ale 6 cyfr, które są "zarezerwowane" dla tego przypadku, nadal wydaje się dość zaskakujące. Może trochę dokumentacji na ten temat? – Ilya

Odpowiedz

4

Wyniki operacji dziesiętnej i numerycznej mają minimalną skalę 6 - jest to określone w tabeli dokumentacji msdn dla podziału, ale to samo zachowanie dotyczy mnożenia, jak również w przypadku obcięcia skali, jak w twoim przykładzie.

To zachowanie jest opisane bardziej szczegółowo na temat sqlprogrammability blog.