Yanıtlar:
Yüzdelerinizde iki ondalık basamak olduğunu varsayarsak, kullandığınız veri türü yüzdelerinizi nasıl depolamayı planladığınıza bağlıdır. Bunların kesirli eşdeğerini depolayacaksanız (ör.% 100.00, 1.0000 olarak saklanacaksa), değerleri hiçbir zaman 1.0000'ü geçmemesini (sınırın sınır olduğu varsayılarak) ve asla 0'ın altına düşmemesini sağlayan decimal(5,4)
bir CHECK
kısıtlama ile bir veri türünde saklarım. (zemin olduğunu varsayarak). Yüz değerlerini saklayacaksanız (örneğin% 100.00, 100.00 olarak saklanır), o zaman decimal(5,2)
uygun bir CHECK
kısıtlamayla kullanmalısınız. İyi bir sütun adıyla birleştirildiğinde, diğer geliştiricilere verilerin ne olduğunu ve verilerin sütunda nasıl depolandığını açıklar.
decimal(5,2)
2'nin ondalık ayırıcıdan sonraki basamak sayısını göstermesi gerekmez mi?
decimal(5,2)
bir kontrol kısıtlamasıyla yakalanması gereken şeydir.
decimal(5,4)
ve decimal(5,2)
yukarıdaki yorumdan sonra değiştirildiğini varsayıyorum ... Sanırım decimal(5,4)
daha iyi bir tanım olacaktır - yani 0'dan 1'e 2 ondalık basamakla saklamak istiyorsunuz, 0'dan 100'e değil. Yüzde olmanın nedeni 100; yani% 100, 100/100 yani 1'dir. Bu şekilde yapmak çoğu durumda daha mantıklıdır (örneğin 100% * 100% = 100%
, değil 10000%
; 1 * 1 = 1
).
100.00
), İhtiyacınız var decimal(5,2)
. Değerler kesir olarak saklanacaksa (örn. 1.0000
), İhtiyacınız var decimal(5,4)
. Gönderiyi güncelleyecektir.
decimal
.columnName decimal(precision, scale)
. Kesinlik, sayı içinde tutulabilen toplam basamak sayısını belirtir, ölçek, ondalık basamaktan sonra bunlardan kaçının olduğunu söyler, bu nedenle decimal(3,2)
temsil edilebilecek bir sayıdır. olarak #.##
; decimal(5,3)
olacaktır ##.###
. decimal
ve numeric
aslında aynı şeydir. Ancak decimal
ANSI uyumludur, bu nedenle aksi belirtilmedikçe her zaman kullanın (örn. Şirketinizin kodlama standartlarına göre).Örnek Senaryolar
decimal(5,4)
.decimal(3,2)
.Misal:
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)
)
Daha fazla okuma:
0 to 1
vs 0 to 100
: C #: Yüzdeleri saklama, 50 veya 0.50?Thomas'a katılıyorum ve en azından WPF uygulamaları için DECIMAL (5,4) çözümünü seçerim.
Nedenini öğrenmek için MSDN Sayısal Biçim Dizesi'ne bakın: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
Yüzde ("P") biçim belirticisi bir sayıyı 100 ile çarpar ve yüzdeyi temsil eden bir dizeye dönüştürür.
Daha sonra bunu XAML kodunuzda kullanabilirsiniz:
DataFormatString="{}{0:P}"
Duyarlılık düzeyiniz 2 ondalık basamaksa, bir "küçük nokta" bunu en küçük alanda (2 bayt) halleder. Yüzdeyi 100 ile çarparak saklarsınız.
DÜZENLEME: Ondalık tür muhtemelen daha iyi bir eşleşmedir. O zaman manuel olarak ölçeklendirmenize gerek kalmaz. Değer başına 5 bayt alır.
N'nin 1.00'e yuvarlamak için yeterli çözünürlüğe sahip olduğu yerde sayısal (n, n) kullanın. Örneğin:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)