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?

Author: dakab, 2009-06-29

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
  • real (4 bajt) (Przybliżony Liczbowy Typ Danych)
  • float (8 bajtów) ( przybliżony liczbowy typ danych)
    • będzie mapować, aby podwoić w. NET
  • Wszystkie dokładne typy liczbowe zawsze dają ten sam wynik, niezależnie od rodzaju zastosowana jest architektura procesora lub wielkość of the numbers
  • parametr dostarczany do typu danych float określa liczbę bitów, które są używany do przechowywania mantissa liczby zmiennoprzecinkowej .
  • przybliżony numeryczny typ danych zwykle zużywa mniej pamięci i ma lepszą szybkość (do 20x) i należy również wziąć pod uwagę, kiedy zostały przekonwertowane w. NET
  • Dokładne Numeryczne Typy DanychPrzybliżone Numeryczne Typy Danych

    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

     373
    Author: Iman Abidi,
    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

     18
    Author: kmote,
    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ść. "

    Http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

     11
    Author: A-K,
    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:

    Link referencyjny

     9
    Author: Stephan,
    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.

     7
    Author: Brian Reiter,
    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.

    Odniesienie 1 2 3

     1
    Author: Somnath Muluk,
    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