Come interpretare la precisione e la scala di un numero in un database?


245

Ho la seguente colonna specificata in un database: decimale (5,2)

Come si interpreta questo?

In base alle proprietà della colonna visualizzate in SQL Server Management studio, posso vedere che significa: decimale (precisione numerica, scala numerica).

Cosa significano precisione e scala in termini reali?

Sarebbe facile interpretarlo come un decimale con 5 cifre e due cifre decimali ... cioè 12345.12

PS Sono stato in grado di determinare la risposta corretta da un collega, ma ho avuto grandi difficoltà a trovare una risposta online. Come tale, mi piacerebbe avere la domanda e la risposta documentate qui su StackOverflow per riferimento futuro.

Risposte:


396

La precisione numerica si riferisce al numero massimo di cifre presenti nel numero.

cioè 1234567.89 ha una precisione di 9

La scala numerica si riferisce al numero massimo di posizioni decimali

vale a dire 123456.789 ha una scala di 3

Pertanto, il valore massimo consentito per il decimale (5,2) è 999,99


14
Non dimenticare che se stai utilizzando un sistema che ti consente di pre-definire la precisione e il ridimensionamento di un input per una percentuale in qualcosa come Microsoft Access, devi considerare la percentuale in quanto è un numero intero. In questo caso, il 25,5% richiederebbe la precisione 4 e la scala 3 (non una) poiché dobbiamo considerarla come .255. Mi sono imbattuto in questo problema all'inizio e sono rimasto per un po 'sconcertato chiedendomi perché la scala 1 non funzionasse.
Ashton Sheets,

1
@mezoide Cosa significa un valore di scala negativo?
Geek,

@Geek Secondo technet.microsoft.com/en-us/library/ms187746.aspx La scala non può essere inferiore a zero. 0 <= scala <= precisione. In sostanza un valore di scala negativo sarebbe privo di significato.
mezoide,


1
Non dovrebbe essere: "La precisione numerica si riferisce al numero massimo di cifre che potrebbero essere presenti nel numero". Anche il numero esatto 123.5 potrebbe essere di precisione 10, ma non ci sono più cifre da aggiungere. O diventerebbe 123.5000000?
Chris311,

86

La precisione di un numero è il numero di cifre.

La scala di un numero è il numero di cifre dopo il punto decimale.

Ciò che è generalmente implicito quando si imposta la precisione e la scala sulla definizione del campo è che rappresentano i valori massimi .

Esempio, un campo decimale definito con precision=5e scale=2consentirebbe i seguenti valori:

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

I seguenti valori non sono consentiti o causerebbero una perdita di dati:

  • 12.345(p = 5, s = 3) => potrebbe essere troncato in 12.35(p = 4, s = 2)
  • 1234.56(p = 6, s = 2) => potrebbe essere troncato in 1234.6(p = 5, s = 1)
  • 123.456(p = 6, s = 3) => potrebbe essere troncato in 123.46(p = 5, s = 2)
  • 123450 (p = 6, s = 0) => fuori portata

Si noti che l'intervallo è generalmente definito dalla precisione: |value| < 10^p...


5
Si noti che MS SQL Server non consentirebbe 12345 o 1234.56 poiché "[scala] viene sottratto da [precisione] per determinare il numero massimo di cifre a sinistra del punto decimale." (fonte: decimale e numerico )
molnarm,

Che ne dici 12345000? Precisione 5 o 8? Se 5, con quale scala? Scala -3?
towi,

@towi cosa significa? Se lo volessi conservare, utilizzeresti 8,0.
Rob Grant,

Bella risposta, ma perché è 123450 (p=6,s=0)fuori portata? 123450 ha 6 cifre e nessuna cifra dopo un punto?
Matthias Burger

1
@MatthiasBurger 123450 (p=6,s=0)sarebbe fuori portata per un campo decimale con precisione 5 (come indicato nell'esempio). Perché la precisione di un numero che si desidera memorizzare in un campo deve essere inferiore o uguale alla precisione del campo.
Snozzlebert,

26

Precisione, scala e lunghezza nella documentazione di SQL Server 2000 recita:

La precisione è il numero di cifre in un numero. Scala è il numero di cifre a destra del punto decimale in un numero. Ad esempio, il numero 123.45 ha una precisione di 5 e una scala di 2.


Grazie. Mi sono appena reso conto che un pezzo di codice Delphi / Pascal stava usando una scala di 0 per tagliare la parte decimale del float
peterchaula
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.