Yüzde değerlerini tutmak için uygun veri türü?


Yanıtlar:


132

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 CHECKkı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 CHECKkı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.


12
decimal(5,2)2'nin ondalık ayırıcıdan sonraki basamak sayısını göstermesi gerekmez mi?
Boris Callens

2
@BorisCallens - Bunca yıldır bunu kaçırdığıma inanamıyorum. Evet, bu bir yazım hatası. decimal(5,2)bir kontrol kısıtlamasıyla yakalanması gereken şeydir.
Thomas

4
Bunun orijinal olarak olduğunu 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).
JohnLBevan

4
@JohnLBevan - Nasıl depolandıklarına harcıyor. Değerler gösterildiği gibi saklanacaksa (örn. 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.
Thomas

Neden 4 ondalık basamağa ihtiyacınız olduğunu açıklayan var mı? 2 kullanamaz mısın? .91 ===% 91 veya 1.00 ===% 100 gibi. Bunu şimdi uyguluyorum ve 4 sıra ile kazancı merak ediyordum. Pct ondalık (10, 2) CHECK (Pct> =. 01 VE Pct <= 1) gibi bir şey. Şimdiden teşekkürler.
MH

31
  • Olarak tutun decimal.
  • Aralığı sınırlamak istiyorsanız kontrol kısıtlamaları ekleyin (örneğin% 0 ile% 100 arasında; bazı durumlarda% 100'ün ötesine veya hatta potansiyel olarak negatiflere geçmek için geçerli nedenler olabilir).
  • 1 değerini% 100, 0,5 değerini% 50, vb. Olarak ele alın. Bu, herhangi bir matematik işleminin beklendiği gibi işlemesine izin verecektir (yani, 100 değerini% 100 olarak kullanmak yerine).
  • Hassasiyeti gerektiği gibi değiştirin ve ölçeklendirin (bunlar, parantez içindeki iki değerdir 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 ##.###.
  • decimalve numericaslında aynı şeydir. Ancak decimalANSI uyumludur, bu nedenle aksi belirtilmedikçe her zaman kullanın (örn. Şirketinizin kodlama standartlarına göre).

Örnek Senaryolar

  • Durumunuz için (% 0,00 ila% 100,00) istersiniz decimal(5,4).
  • İstediğiniz en yaygın durum için (% 0 ila% 100) decimal(3,2).
  • Yukarıdakilerin her ikisinde de kontrol kısıtlamaları aynı olacaktır

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:


4

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}"

2

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.


Microsoft, bağlantılarının
çoğunu kırdı

0

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)

3
Bu soru, üç yıldan fazla bir süre önce oldukça yüksek puanlı kabul edilmiş bir cevaba sahiptir. Cevaplanacak eski soruları arıyorsanız, lütfen buraya bakın: stackoverflow.com/unanswered
valverij
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.