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 CHECK
ograniczeniem, 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 CHECK
ograniczeniem. 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 ##.###
. decimal
i numeric
zasadniczo są tym samym. Jednak decimal
jest 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 1
vs 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)