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 CHECKbatasan 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 CHECKbatasan 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 ##.###. decimaldan numericpada dasarnya adalah hal yang sama. Namun decimalsesuai 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 1vs 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)