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.

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


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...


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.