Bagaimana cara menginterpretasikan ketelitian dan skala angka dalam basis data?

245

Saya memiliki kolom berikut yang ditentukan dalam database: desimal (5,2)

Bagaimana seseorang menafsirkan ini?

Menurut properti pada kolom seperti yang terlihat di SQL Server Management studio saya dapat melihat bahwa itu berarti: desimal (ketepatan Numerik, skala Numerik).

Apa arti presisi dan skala secara riil?

Akan mudah untuk menafsirkan ini sebagai desimal dengan 5 digit dan dua tempat desimal ... yaitu 12345.12

PS Saya sudah bisa menentukan jawaban yang benar dari seorang kolega tetapi mengalami kesulitan besar menemukan jawaban online. Karena itu, saya ingin agar pertanyaan dan jawaban didokumentasikan di sini di stackoverflow untuk referensi di masa mendatang.

mezoid
sumber

Jawaban:

396

Presisi numerik mengacu pada jumlah digit maksimum yang ada dalam nomor tersebut.

yaitu 1234567.89 memiliki ketelitian 9

Skala numerik mengacu pada jumlah maksimum tempat desimal

yaitu 123456.789 memiliki skala 3

Dengan demikian nilai maksimum yang diizinkan untuk desimal (5,2) adalah 999,99

mezoid
sumber
14
Jangan lupa bahwa jika Anda menggunakan sistem yang memungkinkan Anda untuk menentukan sebelumnya presisi dan skala input untuk persentase dalam sesuatu seperti Microsoft Access, Anda harus mempertimbangkan persen sebagai bentuk bilangan bulat. Dalam hal ini, 25,5% akan membutuhkan ketelitian 4 dan skala 3 (bukan satu) karena kita harus menganggapnya sebagai .255. Saya menemukan masalah ini sejak awal dan bingung untuk sementara bertanya-tanya mengapa skala 1 tidak berfungsi.
Ashton Sheets
1
@ idoid Apa artinya nilai skala negatif?
Geek
@Geek Menurut technet.microsoft.com/en-us/library/ms187746.aspx skala tidak bisa kurang dari nol. 0 <= skala <= presisi. Pada dasarnya nilai skala negatif tidak akan berarti.
mezoid
1
Bukankah seharusnya: "Ketepatan angka mengacu pada jumlah maksimum digit yang bisa hadir dalam jumlah."? Angka tepatnya 123,5 bisa presisi 10 juga, tetapi tidak ada lagi angka untuk ditambahkan. Atau akankah ini menjadi 123.5000000?
Chris311
86

Ketepatan angka adalah jumlah digit.

Skala suatu angka adalah jumlah digit setelah titik desimal.

Apa yang secara umum tersirat ketika menetapkan presisi dan skala pada definisi lapangan adalah bahwa mereka mewakili nilai maksimum .

Contoh, bidang desimal yang didefinisikan dengan precision=5dan scale=2akan memungkinkan nilai-nilai berikut:

  • 123.45 (p = 5, s = 2)
  • 12.34 (p = 4, s = 2)
  • 12345 (p = 5, s = 0)
  • 123.4 (p = 4, s = 1)
  • 0 (p = 0, s = 0)

Nilai-nilai berikut tidak diizinkan atau akan menyebabkan kehilangan data:

  • 12.345(p = 5, s = 3) => dapat dipotong ke dalam 12.35(p = 4, s = 2)
  • 1234.56(p = 6, s = 2) => dapat dipotong menjadi 1234.6(p = 5, s = 1)
  • 123.456(p = 6, s = 3) => dapat dipotong menjadi 123.46(p = 5, s = 2)
  • 123450 (p = 6, s = 0) => di luar jangkauan

Perhatikan bahwa kisaran umumnya ditentukan oleh presisi: |value| < 10^p...

boumbh
sumber
5
Perhatikan bahwa MS SQL Server tidak akan mengizinkan 12345 atau 1234.56 karena "[skala] dikurangi dari [presisi] untuk menentukan jumlah maksimum digit di sebelah kiri titik desimal." (sumber: desimal dan numerik )
molnarm
Bagaimana dengan 12345000? Presisi 5 atau 8? Jika 5, dengan Skala apa? Skala -3?
towi
@towi apa artinya itu? Jika Anda ingin menyimpannya, Anda akan menggunakan 8,0.
Rob Grant
Jawaban yang bagus, tetapi mengapa di 123450 (p=6,s=0)luar jangkauan? 123450 memiliki 6 digit dan tidak ada digit setelah satu titik?
Matthias Burger
1
@MatthiasBurger 123450 (p=6,s=0)akan berada di luar jangkauan untuk bidang desimal dengan 5 presisi (sebagaimana disebutkan dalam contoh). Karena ketepatan angka yang ingin Anda simpan di bidang harus kurang dari atau sama dengan ketepatan bidang.
Snozzlebert
26

Presisi, Skala, dan Panjang dalam dokumentasi SQL Server 2000 berbunyi:

Presisi adalah jumlah digit dalam suatu angka. Skala adalah jumlah digit di sebelah kanan titik desimal dalam suatu angka. Misalnya, angka 123,45 memiliki ketepatan 5 dan skala 2.

Chris
sumber
Terima kasih. Saya baru menyadari bahwa sepotong kode Delphi / Pascal menggunakan skala 0 untuk memenggal bagian desimal float
peterchaula