Różnica między numerycznym, zmiennoprzecinkowym i dziesiętnym w SQL Server
Szukałem w Google, a także odwiedziłem decimal and numerici SQL Server Helper, aby zebrać różnicę między numerycznymi, zmiennoprzecinkowymi i dziesiętnymi typami danych, a także dowiedzieć się, który z nich powinien być użyty w jakiej sytuacji.
Dla każdego rodzaju transakcji finansowej (np. dla pola płacowego), która z nich jest preferowana i dlaczego?
6 answers
Używaj typów danych float lub real tylko wtedy, gdydokładność podana przez decimal (do 38 cyfr) jest niewystarczająca
Przybliżone typy danych liczbowych nie przechowują dokładnych wartości podanych dla wielu liczb; przechowują bardzo bliskie przybliżenie wartości.(Technet)
Unikaj używania kolumn float lub real w Warunkach wyszukiwania klauzuli WHERE, zwłaszcza = i operatory (Technet)
Tak ogólnie, ponieważprecyzja zapewniona przez decimal wynosi[10e38 ~ 38 cyfr] jeśli twoja liczba może się zmieścić, a mniejsza przestrzeń dyskowa (a może prędkość) Float nie jest ważna i radzenie sobie z nienormalnymi zachowaniami i problemami przybliżonych typów liczbowych są niedopuszczalne, używaj Decimal ogólnie.
Więcej przydatnych informacji
- numeryczne = dziesiętne (5 do 17 bajtów) ( dokładne Dane liczbowe Typ)
- będzie mapować do dziesiętnego w. NET W SQL server nie ma żadnych ograniczeń co do dokładności i dokładności.]}
- scale = Maksymalna liczba cyfr dziesiętnych, które mogą być zapisane na prawo od punktu dziesiętnego. W związku z tym, że money(8 bajtów) i smallmoney(4 bajty) są również dokładne i mapowane do dziesiętnych w. NET i mają 4 punkty dziesiętne (MSDN )
- decimal and numeric ( Transact-SQL) - MSDN
- będzie mapować do singla w. NET
- synonimem ISO dla real jest float(24)
- float and real (Transact-SQL) - MSDN
- będzie mapować, aby podwoić w. NET
Główne źródło : MCTS Self-Paced Training Kit( egzamin 70-433): Microsoft® SQL Server® 2008 Database Development - Rozdział 3-tabele , typy danych i deklaratywna integralność danych Lekcja 1-wybór typów danych (wytyczne) - strona 93
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:25
Guidelines from MSDN: Using decimal, float, and real Data
Domyślną maksymalną dokładnością typów danych liczbowych i dziesiętnych jest 38. W Transact-SQL liczba jest funkcjonalnie równoważna dziesiętnemu typ danych. Użyj typu danych dziesiętnych do przechowywania liczb z dziesiętnymi kiedy wartości danych muszą być zapisane dokładnie tak, jak określono.
Zachowanie float i real następuje Specyfikacja IEEE 754 dotycząca przybliżonych liczbowych typów danych. Ze względu na przybliżony charakter typów danych float i real, nie należy używać tych typów danych, gdy dokładne zachowanie numeryczne jest wymagane, np. w aplikacjach finansowych, w operacje obejmujące zaokrąglanie lub kontrole równości. Zamiast tego użyj typy danych integer, decimal, money lub smallmoney. Unikaj używania float lub prawdziwe kolumny w Warunkach wyszukiwania klauzul WHERE, zwłaszcza = i operatory. najlepiej ograniczyć kolumny float i real do > lub
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-07 15:01:05
Nie kompletna odpowiedź, ale przydatny link:
" często wykonuję obliczenia na podstawie wartości dziesiętnych. W niektórych przypadkach podanie wartości dziesiętnych na float ASAP, przed obliczeniami, daje lepszą dokładność. "
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-29 03:16:46
Różnią się pierwszeństwem typu danych
Dziesiętne i Numeryczne są tymi samymi funkcjonalnie , ale nadal istnieje pierwszeństwo typu danych , które mogą być kluczowe w niektórych przypadkach.
SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')
Wynikowym typem danych jest numeric, ponieważ typ danych ma pierwszeństwo .
Wyczerpująca lista typów danych według pierwszeństwa:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-03 14:37:36
Decimal ma stałą precyzję, podczas gdy float ma zmienną precyzję.
EDIT (nie udało się odczytać całego pytania): Float (53) (aka real) to Liczba zmiennoprzecinkowa o podwójnej precyzji (32-bitowa) w SQL Server. Zmiennoprzecinkowy jest liczbą zmiennoprzecinkową o pojedynczej precyzji. Double to dobre połączenie precyzji i prostoty do wielu obliczeń. Można utworzyć bardzo wysoką precyzję liczby dziesiętnej-do 136-bitowej - ale trzeba też uważać, aby zdefiniować swoją precyzję i skaluj poprawnie tak, aby zawierała wszystkie pośrednie obliczenia do wymaganej liczby cyfr.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-29 11:48:53
Float jest typem danych Approximate-number, co oznacza, że nie wszystkie wartości w zakresie typów danych mogą być dokładnie przedstawione.
Decimal/Numeric jest typem danych o stałej precyzji, co oznacza, że wszystkie wartości w zakresie typów danych mogą być dokładnie reprezentowane z dokładnością i skalą. Możesz użyć dziesiętnego do oszczędzania pieniędzy.
Konwersja z dziesiętnego lub liczbowego na zmiennoprzecinkowy może spowodować pewną utratę precyzji. Dla dziesiętnych lub numerycznych typów danych, SQL Server uważa każdą określoną kombinację precyzji i skali za inny typ danych. DECIMAL(2,2) i DECIMAL(2,4) to różne typy danych. Oznacza to, że 11.22 i 11.2222 są różnymi typami, choć tak nie jest w przypadku float. Dla FLOAT(6) 11.22 i 11.2222 są tymi samymi typami danych.
Możesz również użyć typu danych money, aby zaoszczędzić pieniądze. Jest to natywny typ danych z 4-cyfrową precyzją dla pieniędzy. Większość ekspertów preferuje ten typ danych do zapisywania pieniądze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 09:59:14