Jaki jest najlepszy typ danych do przechowywania wartości procentowych w zakresie od 0,00% do 100,00%?
Jaki jest najlepszy typ danych do przechowywania wartości procentowych w zakresie od 0,00% do 100,00%?
Odpowiedzi:
Zakładając dwa miejsca po przecinku na procentach, typ danych, których używasz, zależy od tego, jak planujesz je przechowywać. Jeśli zamierzasz przechowywać ich ułamkowy odpowiednik (np. 100,00% przechowywane jako 1,0000), przechowywałbym dane w decimal(5,4)typie danych z CHECKograniczeniem, które zapewnia, że wartości nigdy nie przekraczają 1,0000 (zakładając, że jest to limit) i nigdy nie spadają poniżej 0 (zakładając, że jest to podłoga). Jeśli zamierzasz przechowywać ich wartość nominalną (np. 100,00% jest przechowywane jako 100,00), to powinieneś używać decimal(5,2)z odpowiednim CHECKograniczeniem. W połączeniu z dobrą nazwą kolumny wyjaśnia innym programistom, jakie są dane i jak są one przechowywane w kolumnie.
decimal(5,2)tam, gdzie 2 oznacza liczbę cyfr po separatorze dziesiętnym?
decimal(5,2)jest tym, co powinno zostać uchwycone za pomocą ograniczenia sprawdzającego.
decimal(5,4)i został zmieniony decimal(5,2)po powyższym komentarzu ... Myślę, że decimal(5,4)byłaby lepsza definicja - tj. Chcesz zapisać od 0 do 1 z 2 miejscami po przecinku, a nie od 0 do 100. Powód, dla którego wartość procentowa jest poza 100; więc 100% to 100/100, czyli 1. Zrobienie tego w ten sposób ma większy sens w większości przypadków (np. 100% * 100% = 100%nie 10000%; 1 * 1 = 1).
100.00), Potrzebujesz decimal(5,2). Jeśli wartości mają być przechowywane jako ułamki (np. 1.0000), Potrzebujesz decimal(5,4). Zaktualizuje post.
decimal.columnName decimal(precision, scale). Precyzja mówi o całkowitej liczbie cyfr, które można przechowywać w liczbie, skala mówi, ile z nich jest po przecinku, więc decimal(3,2)jest to liczba, którą można przedstawić jak #.##; decimal(5,3)byłoby ##.###. decimali numericzasadniczo są tym samym. Jednak decimaljest zgodny z ANSI, więc zawsze używaj go, chyba że określono inaczej (np. Standardy kodowania firmy).Przykładowe scenariusze
decimal(5,4).decimal(3,2).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)
)
Dalsze czytanie:
0 to 1vs 0 to 100: C #: Przechowywanie procentów, 50 czy 0,50?Zgadzam się z Thomasem i wybrałbym rozwiązanie DECIMAL (5,4) przynajmniej dla aplikacji WPF.
Zajrzyj do ciągu formatu liczbowego MSDN, aby dowiedzieć się, dlaczego: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
Specyfikator formatu procentu („P”) mnoży liczbę przez 100 i konwertuje ją na ciąg reprezentujący wartość procentową.
Wtedy możesz użyć tego w swoim kodzie XAML:
DataFormatString="{}{0:P}"
Jeśli poziom precyzji to 2 miejsca po przecinku, to „smallint” poradzi sobie z tym na najmniejszej przestrzeni (2 bajty). Przechowujesz procent pomnożony przez 100.
EDYCJA: prawdopodobnie lepiej pasuje typ dziesiętny . Wtedy nie musisz ręcznie skalować. Zajmuje 5 bajtów na wartość.
Użyj numeric (n, n), gdzie n ma wystarczającą rozdzielczość, aby zaokrąglić do 1,00. Na przykład:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)