Jawaban:
Dengan asumsi dua tempat desimal pada persentase Anda, tipe data yang Anda gunakan bergantung pada bagaimana Anda berencana untuk menyimpan persentase Anda. Jika Anda akan menyimpan padanan pecahannya (misalnya 100,00% disimpan sebagai 1,0000), saya akan menyimpan data dalam decimal(5,4)
tipe data dengan CHECK
batasan yang memastikan bahwa nilainya tidak pernah melebihi 1,0000 (dengan asumsi itu adalah batasnya) dan tidak pernah di bawah 0 (dengan asumsi itu adalah lantai). Jika Anda akan menyimpan nilai nominalnya (misalnya 100,00% disimpan sebagai 100,00), maka Anda harus menggunakan decimal(5,2)
dengan CHECK
batasan yang sesuai . Dikombinasikan dengan nama kolom yang bagus, ini menjelaskan kepada pengembang lain apa itu data dan bagaimana data disimpan di kolom.
decimal(5,2)
mana 2 menunjukkan jumlah digit setelah pemisah desimal?
decimal(5,2)
adalah apa yang harus ditangkap dengan kendala cek.
decimal(5,4)
dan diubah menjadi decimal(5,2)
setelah komentar di atas ... Saya pikir decimal(5,4)
akan menjadi definisi yang lebih baik - yaitu Anda ingin menyimpan 0 ke 1 dengan 2 tempat desimal, bukan 0 ke 100. Alasan persentase keluar dari 100; jadi 100% adalah 100/100 yaitu 1. Melakukan dengan cara ini lebih masuk akal untuk banyak kasus (mis. 100% * 100% = 100%
, bukan 10000%
; 1 * 1 = 1
).
100.00
) maka Anda perlu decimal(5,2)
. Jika nilai akan disimpan sebagai pecahan (misalnya 1.0000
), maka Anda perlu decimal(5,4)
. Akan memperbarui posting.
decimal
.columnName decimal(precision, scale)
. Presisi menunjukkan jumlah digit yang dapat ditahan dalam angka, skala menunjukkan berapa banyak dari angka tersebut setelah tempat desimal, begitu decimal(3,2)
juga angka yang dapat direpresentasikan sebagai #.##
; decimal(5,3)
akan ##.###
. decimal
dan numeric
pada dasarnya adalah hal yang sama. Namun decimal
sesuai dengan ANSI, jadi selalu gunakan itu kecuali diberitahu sebaliknya (misalnya oleh standar pengkodean perusahaan Anda).Contoh Skenario
decimal(5,4)
.decimal(3,2)
.Contoh:
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)
)
Bacaan lebih lanjut:
0 to 1
vs 0 to 100
: C #: Menyimpan persentase, 50 atau 0,50?Saya setuju dengan Thomas dan saya akan memilih solusi DECIMAL (5,4) setidaknya untuk aplikasi WPF.
Lihat MSDN Numeric Format String untuk mengetahui alasannya: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
Penentu format persen ("P") mengalikan angka dengan 100 dan mengubahnya menjadi string yang mewakili persentase.
Maka Anda akan dapat menggunakan ini di kode XAML Anda:
DataFormatString="{}{0:P}"
Jika 2 tempat desimal adalah tingkat ketepatan Anda, maka "smallint" akan menangani ini di ruang terkecil (2-byte). Anda menyimpan persen dikalikan dengan 100.
EDIT: Jenis desimal mungkin lebih cocok. Maka Anda tidak perlu menskalakan secara manual. Dibutuhkan 5 byte per nilai.
Gunakan numerik (n, n) di mana n memiliki resolusi yang cukup untuk dibulatkan menjadi 1,00. Misalnya:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)