Buduję ten interfejs API, a baza danych będzie przechowywać wartości reprezentujące jedną z następujących czynności:
- odsetek
- średni
- oceniać
Naprawdę nie mam pojęcia, jak przedstawić coś w przedziale od 0 do 100% liczbowo. Tak być powinno
- 0,00 - 1,00
- 0,00 - 100,00
- każda inna alternatywa, której nie znam
Czy jest na to wyraźny wybór? Globalny sposób reprezentowania w bazach danych wartości od 0 do 100% procent? Idąc dalej, jaki jest odpowiedni dla niego typ, zmiennoprzecinkowy czy dziesiętny?
Dziękuję Ci.
int
do reprezentowania setnych lub w jednostkach Permyriad lub ‱.Odpowiedzi:
Zajmę przeciwne stanowisko.
FLOAT
jest dla przybliżonych liczb, takich jak procenty, średnie itp. Powinieneś formatować, wyświetlając wartości, albo w kodzie aplikacji, albo przy użyciuFORMAT()
funkcji MySQL.Nigdy nie testuj
float_value = 1.3
; istnieje wiele powodów, dla których to się nie powiedzie.DECIMAL
należy stosować do wartości pieniężnych.DECIMAL
unika się drugiego zaokrąglania, gdy wartość należy zaokrąglić do dolarów / centów / euro / itp. Księgowi nie lubią ułamków centów.Implementacja MySQL
DECIMAL
pozwala na 65 cyfr znaczących;FLOAT
daje około 7 iDOUBLE
około 16. 7 jest zwykle więcej niż wystarczające dla czujników i obliczeń naukowych.Jeśli chodzi o „procent” - czasami używam,
TINYINT UNSIGNED
gdy chcę zużyć tylko 1 bajt pamięci i nie potrzebuję dużej precyzji; czasami użyłemFLOAT
(4 bajty). Nie ma typu danych dostosowanego specjalnie do wartości procentowej. (Należy również pamiętać, żeDECIMAL(2,0)
nie może utrzymać wartości100
, więc technicznie będziesz potrzebowaćDECIMAL(3,0)
.)Lub czasami użyłem wartości
FLOAT
, która miała wartość od 0 do 1. Ale wtedy musiałbym się upewnić, że pomnożymy przez 100, zanim wyświetli się „procent”.Więcej
Wszystkie trzy „procentowe, średnie, częste” pachną jak pływaki, więc to byłby mój pierwszy wybór.
Jedno kryterium decydowania o typie danych ... Ile kopii wartości będzie istniało?
Jeśli masz tabelę zawierającą miliardy wierszy z kolumną procentową, rozważ,
TINYINT
że zajmie to 1 bajt (łącznie 1 GB), aleFLOAT
zajmie 4 bajty (łącznie 4 GB). OTOH, większość aplikacji nie ma tylu wierszy, więc może to nie mieć znaczenia.Zgodnie z ogólną zasadą w „dokładnych” wartościach należy stosować formę
INT
lubDECIMAL
. Rzeczy niedokładne (obliczenia naukowe, pierwiastki kwadratowe, dzielenie itp.) Powinny używaćFLOAT
(lubDOUBLE
).Ponadto formatowanie danych wyjściowych należy zwykle pozostawić interfejsowi aplikacji. Oznacza to, że chociaż „średnia” może być obliczona na „14.6666666 ...”, wyświetlacz powinien pokazywać coś w rodzaju „14.7”; jest to bardziej przyjazne dla ludzi. Tymczasem masz podstawową wartość, aby później zdecydować, że preferowanym formatowaniem wyjściowym jest „15” lub „14.667”.
Zakres „0,00 - 100,00” można wykonać przy
FLOAT
użyciu formatowania wyjściowego lub przy użyciuDECIMAL(5,2)
(3 bajtów) z wcześniejszym ustaleniem, że zawsze będzie wymagana wskazana dokładność .źródło
Ogólnie odradzam używanie
float
. Liczby zmiennoprzecinkowe reprezentują liczby w bazie-2, co powoduje, że niektóre (dokładne) liczby są zaokrąglane w górę w operacjach lub porównaniach, ponieważ po prostu nie można ich dokładnie zapisać w bazie-2. Może to prowadzić do zaskakujących zachowań.Rozważ następujący przykład :
Porównanie liczby w podstawie 2
1.3
nie powiodło się. To trudne.Dla porównania, dziesiętne zapewniają dokładne odwzorowanie liczb skończonych w ich zakresie. Jeśli zmienisz
float
nadecimal(2, 1)
w powyższym przykładzie, uzyskasz oczekiwane wyniki.źródło
Różnica między liczbą zmiennoprzecinkową a dziesiętną polega na precyzji. Liczba dziesiętna może w 100% dokładnie reprezentować dowolną liczbę z dokładnością do formatu dziesiętnego, natomiast liczba zmiennoprzecinkowa nie może dokładnie reprezentować wszystkich liczb.
Użyj wartości dziesiętnych np. Dla wartości powiązanej z finansami, a liczby zmiennoprzecinkowej użyj np. Dla wartości powiązanej graficznie
źródło
Polecam używać,
decimal(5,2)
jeśli zamierzasz go przechowywać w taki sam sposób, w jaki go wyświetlasz, ponieważdecimal
służy to zachowaniu dokładności. (Zobacz https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html )( https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html )
https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html
źródło
Dziesiętny: W przypadku aplikacji finansowych lepiej jest używać typów dziesiętnych, ponieważ zapewnia wysoki poziom dokładności i łatwe do uniknięcia błędy zaokrąglania
Podwójne: podwójne typy są prawdopodobnie najczęściej używanym typem danych dla rzeczywistych wartości, z wyjątkiem obsługi pieniędzy.
Float: Jest stosowany głównie w bibliotekach graficznych, ponieważ bardzo wysokie wymagania dotyczące mocy obliczeniowych, również w sytuacjach, które mogą znosić błędy zaokrąglania.
Odniesienie: http://net-informations.com/q/faq/float.html
źródło
Dziesiętny zrobił dokładnie to, co powinien zrobić w tych przypadkach, obciął resztę, tracąc w ten sposób część 1/3.
Tak więc dla sum lepsza jest liczba dziesiętna, ale dla podziałów liczba zmiennoprzecinkowa jest lepsza, do pewnego momentu, oczywiście. Mam na myśli, że użycie DECIMAL nie da ci „arytmetyki odpornej na błędy” w żaden sposób.
Mam nadzieję, że to pomoże.
źródło
W tsql: Float, 0.0 zapisuje jako 0 i nie wymaga definiowania po cyfrach dziesiętnych, np. Nie musisz pisać Float (4,2). Dziesiętny, 0.0 przechowuj jako 0.0 i ma opcję definiowania jak dziesiętny (4,2), sugerowałbym 0,00-1,00, robiąc to, możesz obliczyć wartość tego procentu bez pomnożenia przez 100, a jeśli raportujesz, to ustaw typ danych tej kolumny w procentach jak MS Excel i inne widoki platformy
0.5 -> 50%
.źródło