Jakie są różnice między numeric
, float
i decimal
typy danych i które powinny być stosowane, w jakich sytuacjach?
Dla jakiejkolwiek transakcji finansowej (np. W dziedzinie wynagrodzeń), która jest preferowana i dlaczego?
sql
sql-server
types
priyanka.sarkar
źródło
źródło
Odpowiedzi:
Przybliżone numeryczne typy danych nie przechowują dokładnych wartości określonych dla wielu liczb; przechowują bardzo bliskie przybliżenie wartości. ( Technet )
Unikaj używania kolumn zmiennoprzecinkowych lub rzeczywistych w warunkach wyszukiwania klauzul WHERE, zwłaszcza operatorów = i <> ( Technet )
tak ogólnie, ponieważ dokładność zapewniona przez ułamek dziesiętny wynosi [10E38 ~ 38 cyfr], jeśli twój numer może się do niego zmieścić, a mniejsza przestrzeń do przechowywania (i być może szybkość) Float nie jest ważna, a radzenie sobie z nienormalnymi zachowaniami i problemami z przybliżonymi typami liczbowymi nie są dopuszczalne, ogólnie używaj dziesiętnego .
więcej przydatnych informacji
główne źródło : Zestaw do samodzielnego szkolenia MCTS (egzamin 70-433): Rozwój bazy danych Microsoft® SQL Server® 2008 - Rozdział 3 - Tabele, typy danych i deklaratywna integralność danych Lekcja 1 - Wybór typów danych (wytyczne) - Strona 93
źródło
use the float or real data types only if the precision provided by decimal is insufficient
- Myślałem, że prawdziwe jest MNIEJ dokładniejsze niż dziesiętne, więc dlaczego piszesz, aby używać prawdziwego, jeśli dziesiętny jest niewystarczający?decimal
będzie dobrze. Dokładność wynosi 20. Jeśli chcesz przechowywać wartości między, powiedzmy, 1e20 a 1e-20, cóż,decimal
nie możesz tego zrobić. To 40 cyfr precyzji. Nie możesz nigdy przechowywać 1e20 i 1e-20 w tym samymdecimal
polu. Zamiast tego możesz użyćfloat
, który wewnętrznie przechowuje wszystko jako log podstawy 2. To pozwala na pełny zakres precyzji w jednym polu z wadą, że tylko pierwsze ~ 8 cyfr będą dokładne.float
...” - powiedział kto? Czy to cytat czy twoja opinia?Wytyczne MSDN: Używanie danych dziesiętnych, zmiennoprzecinkowych i rzeczywistych
źródło
Scale
kolumnie.numeric
ponieważ nigdy nie będzie przechowywać z większą precyzją, niż prosiłeś: patrz stackoverflow.com/a/759606/626804Nie pełna odpowiedź, ale przydatny link:
„Często wykonuję obliczenia w oparciu o wartości dziesiętne. W niektórych przypadkach rzutowanie wartości dziesiętnych na zmienne jak najszybciej, przed wszelkimi obliczeniami, daje lepszą dokładność”.
http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx
źródło
decimal
ifloat
są różne . Liczby dziesiętne chronią przed niedopełnieniem w jak największym stopniu poprzez zwiększenie precyzji lub skali. Jednak po osiągnięciu limitu znaczących cyfr po przecinku niedomiar jest cichy (a precyzja jest tracona). Pływak ma szerszy możliwy zakres skali, a jej ograniczenia w rzeczywistości są przyczyną niedomiaru. Dlatego float może mieć lepszą skalę. Niemniej jednak jest to wciąż niedokładny typ.Różnią się priorytetem typów danych
Dziesiętny i numeryczny są takie same funkcjonalnie, ale nadal istnieje pierwszeństwo typu danych , które może być kluczowe w niektórych przypadkach.
Wynikowy typ danych jest liczbowy, ponieważ ma pierwszeństwo dla typu danych .
Wyczerpująca lista typów danych według pierwszeństwa:
Link referencyjny
źródło
Dziesiętny ma stałą precyzję, a zmiennoprzecinkowy zmienną.
EDYCJA (nie przeczytałem całego pytania): Liczba zmiennoprzecinkowa (53) (znana również jako rzeczywista) jest liczbą zmiennoprzecinkową podwójnej precyzji (32-bit) w programie SQL Server. Regular Float to liczba zmiennoprzecinkowa pojedynczej precyzji. Double to dobre połączenie precyzji i prostoty do wielu obliczeń. Możesz utworzyć bardzo dokładną liczbę dziesiętną - do 136-bitów - ale musisz również uważać, aby poprawnie zdefiniować swoją precyzję i skalować, aby zawierała wszystkie obliczenia pośrednie do niezbędnej liczby cyfr.
źródło
Liczba zmiennoprzecinkowa jest typem danych o przybliżonej liczbie, co oznacza, że nie wszystkie wartości w zakresie typów danych mogą być dokładnie reprezentowane.
Dziesiętny / Numeryczny jest typem danych o stałej precyzji, co oznacza, że wszystkie wartości w zakresie typów danych mogą być dokładnie przedstawione z dokładnością i skalą. Aby zaoszczędzić pieniądze, możesz użyć dziesiętnego.
Konwersja z dziesiętnej lub numerycznej na zmiennoprzecinkową może spowodować utratę precyzji. W przypadku dziesiętnych lub liczbowych typów danych SQL Server traktuje każdą konkretną kombinację precyzji i skali jako 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, chociaż nie jest tak w przypadku float. Dla FLOAT (6) 11.22 i 11.2222 są tymi samymi typami danych.
Możesz także użyć typu danych pieniędzy do oszczędzania pieniędzy. Jest to rodzimy typ danych z 4-cyfrową precyzją dla pieniędzy. Większość ekspertów woli ten typ danych dla oszczędności pieniędzy.
Odniesienie 1 2 3
źródło
Przypadek dziesiętny
Jaka jest podstawowa potrzeba?
Wynika to z faktu, że ostatecznie komputery wewnętrznie reprezentują liczby w formacie binarnym. Prowadzi to nieuchronnie do błędów zaokrąglania.
Rozważ to:
Powyższa elipsa [...] oznacza „nieskończony”. Jeśli przyjrzysz się temu uważnie, pojawi się nieskończony powtarzający się wzór (= „0011”)
W pewnym momencie komputer musi zaokrąglić tę wartość. Prowadzi to do błędów akumulacji wynikających z wielokrotnego używania liczb, które są niedokładnie przechowywane.
Powiedz, że chcesz przechowywać kwoty finansowe (które są liczbami, które mogą mieć część ułamkową). Po pierwsze, nie można oczywiście używać liczb całkowitych (liczby całkowite nie mają części ułamkowej). Z czysto matematycznego punktu widzenia naturalną tendencją byłoby użycie
float
. Ale w komputerze liczby zmiennoprzecinkowe mają tę część liczby, która znajduje się po przecinku - „mantysa” - ograniczona. Prowadzi to do błędów zaokrąglania.Aby temu zaradzić, komputery oferują określone typy danych, które ograniczają błąd zaokrąglania binarnego w komputerach dla liczb dziesiętnych. Są to typy danych, które należy bezwzględnie wykorzystać do przedstawienia kwot finansowych. Te typy danych zwykle mają nazwę
Decimal
. Tak jest na przykład w języku C #. LubDECIMAL
w większości baz danych.źródło
Chociaż pytanie nie zawierało typu danych PIENIĄDZE, niektórzy ludzie przechodzący przez ten wątek mogą ulec pokusie użycia typu danych PIENIĄDZE do obliczeń finansowych.
Uważaj na typ danych PIENIĄDZE, ma on ograniczoną precyzję.
Istnieje wiele dobrych informacji na ten temat w odpowiedziach na to pytanie Stackoverflow:
Czy należy wybrać typy danych PIENIĄDZE lub DECIMAL (x, y) w SQL Server?
źródło