Jak interpretować precyzję i skalę liczby w bazie danych?

245

Mam w bazie danych następującą kolumnę: dziesiętny (5,2)

Jak to interpretować?

Zgodnie z właściwościami kolumny wyświetlanymi w SQL Server Management Studio widzę, że oznacza to: dziesiętny (precyzja numeryczna, skala numeryczna).

Co dokładnie oznacza precyzja i skala?

Łatwo byłoby zinterpretować to jako miejsce dziesiętne z 5 cyframi i dwoma miejscami po przecinku ... tj. 12345.12

PS Udało mi się ustalić prawidłową odpowiedź od kolegi, ale miałem duże trudności ze znalezieniem odpowiedzi online. W związku z tym chciałbym, aby pytanie i odpowiedź zostały udokumentowane tutaj na przepełnieniu stosu do wykorzystania w przyszłości.

mezoid
źródło

Odpowiedzi:

396

Precyzja liczbowa odnosi się do maksymalnej liczby cyfr obecnych w liczbie.

tzn. 1234567,89 ma dokładność 9

Skala numeryczna odnosi się do maksymalnej liczby miejsc po przecinku

tzn. 123456,789 ma skalę 3

Zatem maksymalna dozwolona wartość dziesiętna (5,2) wynosi 999,99

mezoid
źródło
14
Nie zapominaj, że jeśli używasz systemu, który pozwala wstępnie zdefiniować precyzję i skalę danych wejściowych dla procentu w czymś takim jak Microsoft Access, musisz wziąć pod uwagę procent w postaci liczby całkowitej. W tym przypadku 25,5% wymagałoby dokładności 4 i skali 3 (nie jednej), ponieważ musimy uznać to za .255. Natknąłem się na ten problem wcześnie i byłem zaskoczony, zastanawiając się, dlaczego skala 1 nie działa.
Ashton Sheets
1
@mezoid Co oznacza ujemna wartość skali?
Geek
@Geek Według technet.microsoft.com/en-us/library/ms187746.aspx Skala nie może być mniejsza niż zero. 0 <= skala <= precyzja. Zasadniczo ujemna wartość skali byłaby bez znaczenia.
mezoid
1
Czy nie powinno być: „Precyzja liczbowa odnosi się do maksymalnej liczby cyfr, które mogą występować w liczbie”. Dokładna liczba 123,5 może mieć również dokładność 10, ale nie ma już więcej cyfr do dodania. Czy stałoby się to 123.5000000?
Chris311,
86

Precyzja liczby to liczba cyfr.

Skala liczby to liczba cyfr po przecinku.

Zasadniczo przy ustalaniu precyzji i skali w definicji pola sugeruje się, że reprezentują one wartości maksymalne .

Przykład, dziesiętne pole zdefiniowane za pomocą precision=5i scale=2pozwoliłoby na następujące wartości:

  • 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)

Następujące wartości są niedozwolone lub spowodowałyby utratę danych:

  • 12.345(p = 5, s = 3) => może zostać obcięty do 12.35(p = 4, s = 2)
  • 1234.56(p = 6, s = 2) => może zostać obcięty do 1234.6(p = 5, s = 1)
  • 123.456(p = 6, s = 3) => może zostać obcięty do 123.46(p = 5, s = 2)
  • 123450 (p = 6, s = 0) => poza zakresem

Należy pamiętać, że zakres jest ogólnie określony przez precyzję: |value| < 10^p...

Boumbh
źródło
5
Zauważ, że MS SQL Server nie zezwala na 12345 lub 1234.56, ponieważ „[skala] jest odejmowana od [precyzja] w celu ustalenia maksymalnej liczby cyfr po lewej stronie przecinka dziesiętnego”. (źródło: dziesiętny i numeryczny )
molnarm
Jak o 12345000? Precyzja 5 czy 8? Jeśli 5, z jaką skalą? Skala -3?
towi
@towi co to znaczy? Jeśli chcesz to zapisać, użyłbyś 8,0.
Rob Grant,
Dobra odpowiedź, ale dlaczego jest 123450 (p=6,s=0)poza zasięgiem? 123450 ma 6 cyfr i żadnych cyfr po punkcie?
Matthias Burger
1
@MatthiasBurger 123450 (p=6,s=0)byłby poza zakresem dla pola dziesiętnego z dokładnością do 5 (jak wspomniano w przykładzie). Ponieważ dokładność liczby, którą chcesz zapisać w polu, musi być mniejsza lub równa precyzji pola.
Snozzlebert
26

Precyzja, Skala i Długość w dokumentacji SQL Server 2000 brzmi:

Precyzja to liczba cyfr w liczbie. Skala to liczba cyfr po prawej stronie przecinka dziesiętnego w liczbie. Na przykład liczba 123.45 ma dokładność 5 i skalę 2.

Chris
źródło
Dziękuję Ci. Właśnie zdałem sobie sprawę, że kawałek kodu Delphi / Pascal używa skali 0, aby odciąć dziesiętną część pływaka
peterchaula, 10'18