Odpowiedni typ danych do przechowywania wartości procentowych?
Jaki jest najlepszy typ danych do przechowywania wartości procentowych od 0,00% do 100,00%?
5 answers
Zakładając dwa miejsca po przecinku na procentach, typ danych, którego używasz, zależy od tego, jak zamierzasz przechowywać swoje procenty. Jeśli zamierzasz przechowywać ich ułamkowy odpowiednik (np. 100.00% zapisane jako 1.0000), chciałbym przechowywać dane w typie danych decimal(5,4)
z ograniczeniem CHECK
, który zapewnia, że wartości nigdy nie przekraczają 1.0000 (zakładając, że jest to cap) i nigdy nie schodzą poniżej 0 (zakładając, że jest to Podłoga). Jeśli zamierzasz zapisać ich wartość nominalną (np. 100.00% jest zapisywane jako 100.00), to powinien używać {[2] } z odpowiednim ograniczeniem CHECK
. W połączeniu z dobrą nazwą kolumny, wyjaśnia innym programistom, jakie są dane i w jaki sposób dane są przechowywane w kolumnie.
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-05-15 21:01:29
- Hold as a
decimal
. - Dodaj ograniczenia wyboru, jeśli chcesz ograniczyć zakres (np. od 0 do 100%; w niektórych przypadkach mogą istnieć ważne powody, aby wykraczać poza 100% lub potencjalnie nawet do negatywów).
- traktuj wartość 1 jako 100%, 0,5 jako 50% itd. Pozwoli to na działanie dowolnych operacji matematycznych zgodnie z oczekiwaniami (tj. w przeciwieństwie do użycia wartości 100 jako 100%).
- Zmień dokładność i skalę zgodnie z wymaganiami (są to dwie wartości w nawiasach
columnName decimal(precision, scale)
. Precision says the całkowita liczba cyfr, które mogą być utrzymane w liczbie, skala mówi, ile z nich jest po przecinku, więc {[3] } jest liczbą, która może być reprezentowana jako#.##
;decimal(5,3)
byłoby##.###
. -
decimal
inumeric
są zasadniczo tym samym. Jednak {[1] } jest zgodny z ANSI, więc zawsze używaj tego, o ile nie powiedziano inaczej (np. przez standardy kodowania Twojej firmy).
Przykładowe Scenariusze
- dla Twojego przypadku (0,00% do 100,00%) chcesz
decimal(5,4)
. - dla najczęstszy przypadek (0% do 100%), który chcesz
decimal(3,2)
. - w obu powyższych ograniczeniach kontrola będzie taka sama
Przykład:
if object_id('Demo') is null
create table Demo
(
Id bigint not null identity(1,1) constraint pk_Demo primary key
, Name nvarchar(256) not null constraint uk_Demo unique
, SomePercentValue decimal(3,2) constraint chk_Demo_SomePercentValue check (SomePercentValue between 0 and 1)
, SomePrecisionPercentValue decimal(5,2) constraint chk_Demo_SomePrecisionPercentValue check (SomePrecisionPercentValue between 0 and 1)
)
Czytaj Dalej:
- Skala i dokładność dziesiętna: http://msdn.microsoft.com/en-us/library/aa258832%28SQL.80%29.aspx
-
0 to 1
vs0 to 100
: C#: przechowywanie procentów, 50 czy 0.50? - dziesiętne vs Numeryczne: czy jest jakaś różnica między Dziesiętne i numeryczne w SQL serverze?
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:54:50
Jeśli 2 miejsca po przecinku to twój poziom precyzji, wtedy "smallint" obsłuży to w najmniejszej przestrzeni (2-bajty). Zapisujesz procent pomnożony przez 100.
EDIT: typ dziesiętny jest prawdopodobnie lepszym dopasowaniem. Wtedy nie musisz ręcznie skalować. Zajmuje 5 bajtów na wartość.
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
2010-05-04 01:54:01
Zgadzam się z Thomasem i wybrałbym rozwiązanie dziesiętne(5,4) przynajmniej dla aplikacji WPF.
Spójrz na ciąg liczbowy formatu MSDN, aby wiedzieć, dlaczego : http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
Specyfikacja formatu percent ("P") mnoży liczbę przez 100 i zamienia ją na ciąg, który reprezentuje procent.
Wtedy będziesz mógł użyć tego w swoim kodzie XAML:
DataFormatString="{}{0:P}"
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-06-05 08:48:59
Użyj liczb (n,n), gdzie n ma wystarczającą rozdzielczość do zaokrąglenia do 1.00. Na przykład:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)
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
2013-07-29 20:56:33