2011-11-11 11 views
7

Mam wartość 1555.4899999999998 przechowywaną w kolumnie float z domyślną precyzją (53). Kiedy robię proste select, SSMS zaokrągla dane wyjściowe zamiast drukować je z całą dostępną dokładnością. Ostatnio spowodowało to dla mnie kilka luk, ponieważ wydrukowana wartość nie działa jako literał, aby dopasować rzeczywistą zapisaną wartość.Dane wyjściowe pełnej dokładności typów zmiennoprzecinkowych w SQL Server Management Studio

Przykładowo (zauważ, że oba numery mieć dokładną reprezentację w uproszczonych float)

declare @f1 float 
declare @f2 float 
set @f1 = 1555.49 
set @f2 = 1555.4899999999998 
select @f1, @f2 
select STR(@f1,30,15), STR(@f2,30,15) 

Wyjścia:

1555.49 1555.49 
1555.490000000000000 1555.489999999999800 

analizator zapytań, po pierwsze select wyjścia:

1555.49 1555.4899999999998 

Takie zachowanie chcę uzyskać z Management Studio. Czy istnieje sposób na zapobieganie zaokrąglaniu SSMS w wyświetlaniu wyników?

Odpowiedz

7

nr

SQL Server Management Studio zaokrągla zmiennoprzecinkowych do celów wystawowych; istnieje Connect suggestion to change this behavior, ale jest zamknięty "jak z projektu".

Jednak, SQLCMD, osql i analizatora zapytań nie.

SQLCMD -E -S server -Q"SELECT CONVERT(FLOAT, 1555.4899999999998)" 
0

Czy istnieje powód, dla którego wolałbyś używać typu zmiennoprzecinkowego niż dziesiętnego? Pływaki są przechowywane w postaci ułamków, co powoduje, że często są nieznacznie niewystarczające podczas wykonywania operacji na nich. Jest to w porządku, gdy masz aplikację graficzną, w której niedokładność jest o wiele mniej znacząca niż rozmiar piksela, ale jest to poważny problem w aplikacjach księgowych, w których masz do czynienia z pieniędzmi.

Zaryzykowałbym stwierdzenie, że dokładność dziesiętnej jest ważniejsza dla większości aplikacji niż jakakolwiek korzyść w szybkości lub wielkości, jaką uzyskaliby przy użyciu pływaka.

+1

Schemat bazy danych jest poza moją kontrolą, Niestety. Jestem w 100% zgodna, że ​​'float' jest złym wyborem dla tej aplikacji, ale jeśli byłby to właściwy typ, nadal oczekiwałbym dokładniejszej reprezentacji w Management Studio. – Simon

-2

Edytuj do mojego oryginalnego wpisu. Próbowałem rozwiązać nieco inny problem, gdy natknąłem się na tę stronę. Po prostu chciałem, aby typ zmiennoprzecinkowy zwrócił "zwykłą" liczbę, a nie notację naukową.

Proponowane początkowo dwie konwersje. Zlikwiduj to na tym końcu. Poniższe 7 może zostać zmienione, aby pokazać tyle miejsc po przecinku, ile chcesz. Zastąp i wykończenia pozbywają się zer wiodących i końcowych.

wymiany (RTRIM (LTRIM (Replace (STR (x, 20, 7), '0', ' '))),'', '0')

+2

Celem nie jest konwersja do VARCHAR. Wywołania STR() w moim przykładzie już to robią. Miałem nadzieję zmienić domyślne zachowanie SSMS bez konieczności dodawania konwersji do mojego zapytania. Nawiasem mówiąc, 5 miejsc po przecinku nie jest wystarczające do rozróżnienia wartości w moim przykładzie. Do tego potrzebujesz co najmniej DECIMAL (28,13). – Simon

+0

Edytowałem swoją odpowiedź. Nadal nie pomaga w SSMS. Po prostu zwraca reprezentację ciągów, które chciałem. Być może pomocne rozwiązanie. – user600410

Powiązane problemy