Jenis data yang sesuai untuk menyimpan nilai persen?

Jawaban:

132

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.

Thomas
sumber
12
Bukankah seharusnya di decimal(5,2)mana 2 menunjukkan jumlah digit setelah pemisah desimal?
Boris Callens
2
@BorisCallens - Tidak percaya saya melewatkan itu selama ini. Ya, itu salah ketik. decimal(5,2)adalah apa yang harus ditangkap dengan kendala cek.
Thomas
4
Saya berasumsi ini awalnya memiliki 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).
JohnLBevan
4
@JohnLBevan - Ini digunakan untuk bagaimana mereka disimpan. Jika nilai akan disimpan seperti yang ditampilkan (misalnya 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.
Thomas
Adakah yang bisa menjelaskan mengapa Anda membutuhkan 4 tempat desimal? Tidak bisakah kamu menggunakan 2? Seperti 0,91 === 91% atau 1,00 === 100%. Saya menerapkan ini sekarang dan bertanya-tanya keuntungan dengan 4 tempat. Sesuatu seperti Pct desimal (10, 2) PERIKSA (Pct> =. 01 DAN Pct <= 1). Terima kasih sebelumnya.
MH
31
  • Pegang sebagai decimal.
  • Tambahkan kendala centang jika Anda ingin membatasi rentang (misalnya antara 0 hingga 100%; dalam beberapa kasus mungkin ada alasan yang valid untuk melampaui 100% atau bahkan berpotensi ke negatif).
  • Perlakukan nilai 1 sebagai 100%, 0,5 sebagai 50%, dll. Ini akan memungkinkan operasi matematika apa pun berfungsi seperti yang diharapkan (yaitu sebagai lawan menggunakan nilai 100 sebagai 100%).
  • Ubah presisi dan skala sesuai kebutuhan (ini adalah dua nilai dalam tanda kurung 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

  • Untuk kasus Anda (0,00% hingga 100,00%) yang Anda inginkan decimal(5,4) .
  • Untuk kasus paling umum (0% hingga 100%) yang Anda inginkan decimal(3,2) .
  • Dalam kedua cara di atas, batasan pemeriksaan akan sama

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:

JohnLBevan
sumber
4

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}"
pjehan
sumber
2

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.

mdma
sumber
Microsoft telah merusak begitu banyak
tautannya
0

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)
pengguna2202942
sumber
3
Pertanyaan ini memiliki jawaban yang diterima berperingkat cukup tinggi dari lebih dari tiga tahun yang lalu. Jika Anda mencari pertanyaan lama untuk dijawab, lihat di sini: stackoverflow.com/unanswered
valverij