myślę, że powinno być rozumiane, co dzieje się za kulisami w przyszłości w podobnych przypadkach.
Dosłowne wartości liczbowe z kropką dziesiętną z wyłączeniem notacji naukowej reprezentują typ danych dziesiętnych, który jest przechowywany jako najmniejszy możliwy typ dziesiętny. Tak samo jak cytat z Lieven Keersmaekers użytkownika: https://msdn.microsoft.com/en-us/library/ms191530%28SQL.90%29.aspx#_decimal
W Transact-SQL, stała z przecinkiem jest automatycznie przekształcona liczbową wartość danych, przy użyciu minimalnej precyzję i skalę niezbędną. Na przykład, stały 12.345 jest przekształcono w wartości liczbowej z dokładnością do 5, a skalę 3.
The zer na prawo od kropki dziesiętnej określić skalę. Przednie z lewej strony kropki dziesiętnej są ignorowane.
Kilka przykładów:
1.0 -> Decimal(2,1)
60.0 -> Decimal(3,1)
1.00 -> Decimal(3,2)
01.0 -> Decimal (2,1)
Inną kwestią do rozważenia jest Data Type precedence. Gdy operator łączy dwa wyrażenia różnych typów danych, reguły pierwszeństwa typu danych określają, że typ danych o niższym priorytecie jest konwertowany na typ danych o wyższym priorytecie. Jeszcze jeden punkt do rozważenia jest to, czy wykonujemy operacje arytmetyczne na typach dziesiętnych, że wynikowy typ dziesiętny, tj. Precyzja i skala zależą od obu operandów i samej operacji. Jest to opisane w dokumencie Precision, Scale, and Length.
Więc część swojej wypowiedzi w nawiasie
(1.0/60.0) is evaluated to 0.016666 and the resulting type is Decimal (8,6)
użyciu wyżej przepisów o precyzji i skali wyrażeń po przecinku. Dodatkowo stosuje się zaokrąglanie lub zaokrąglanie bankiera do parzystości. Ważne jest, aby zauważyć, że używane są różne zaokrąglenia dla dziesiętnych i typu zmiennoprzecinkowego. Jeśli nadal ekspresję
1.0/0.016666 is evaluated to 60.002400096 and the resulting type is Decimal (17,10)
Więc część rozbieżności ze względu na zaokrąglenia inny używany dla typów dziesiętnych niż dla pływaka.
Zgodnie z powyższymi zasadami wystarczy użyć tylko jednego odlewu w nawiasie. Każdy inny literał będzie promowany w celu unoszenia się zgodnie z regułami pierwszeństwa typu danych.
1.0/(1.0/cast(60.0 as float))
I jeszcze jedna WAŻNA rzecz. Nawet to wyrażenie float nie oblicza dokładnego wyniku. Jest tak, że front (SSMS lub cokolwiek innego) zaokrągla wartość do (myślę) dokładność 6 cyfr, a następnie obcina końcowe zera. Więc to 1.000001 staje się 1.
Proste, czyż nie?
Ah .. Nie znałem tej metody aż do teraz. Bardzo dziękuję :) – VVS
Więc nie ma sposobu na wyraźną obsadę, aby uzyskać oczekiwany rezultat? Czy istnieje inny sposób powiedzenia serwerowi SQL, że dany literał jest typu (np.) Zmiennoprzecinkowy? – VVS
@VVS, oprócz wyraźnej obsady, którą już wykonujesz, o czym nie wiem. SQL Server zawsze interpretuje wartość jako numeryczną.Problem można nieco złagodzić, jeśli dodajesz precyzję do wartości takich jak 1.000000000000000000000000000000000000. –