Como interpreto a precisão e a escala de um número em um banco de dados?

245

Eu tenho a seguinte coluna especificada em um banco de dados: decimal (5,2)

Como se interpreta isso?

De acordo com as propriedades da coluna, como visualizadas no SQL Server Management studio, posso ver que isso significa: decimal (precisão numérica, escala numérica).

O que precisão e escala significam em termos reais?

Seria fácil interpretar isso como um decimal com 5 dígitos e duas casas decimais ... ou seja, 12345.12

PS: Consegui determinar a resposta correta de um colega, mas tive grande dificuldade em encontrar uma resposta on-line. Como tal, gostaria de ter a pergunta e resposta documentadas aqui no stackoverflow para referência futura.

mezoid
fonte

Respostas:

396

A precisão numérica refere-se ao número máximo de dígitos presentes no número.

1234567.89 tem uma precisão de 9

Escala numérica refere-se ao número máximo de casas decimais

123456.789 tem uma escala de 3

Portanto, o valor máximo permitido para decimal (5,2) é 999,99

mezoid
fonte
14
Não se esqueça de que, se você estiver usando um sistema que permita pré-definir a precisão e a escala de uma entrada para uma porcentagem em algo como o Microsoft Access, considere a porcentagem como seu número inteiro. Nesse caso, 25,5% exigiriam precisão 4 e escala de 3 (não uma), pois precisamos considerá-la como 0,255. Me deparei com esse problema desde o início e fiquei perplexo por um tempo imaginando por que a escala 1 não estava funcionando.
Ashton Sheets
1
@mezoid O que significa um valor de escala negativo?
Geek
@ Geek De acordo com technet.microsoft.com/en-us/library/ms187746.aspx A escala não pode ser menor que zero. 0 <= escala <= precisão. Essencialmente, um valor de escala negativo não teria sentido.
mezoid
1
Não deveria ser: "Precisão numérica refere-se ao número máximo de dígitos que podem estar presentes no número."? O número exato 123.5 também pode ter a precisão 10, mas não há mais dígitos a serem adicionados. Ou isso se tornaria 123.5000000?
Chris311
86

Precisão de um número é o número de dígitos.

Escala de um número é o número de dígitos após o ponto decimal.

O que geralmente está implícito ao definir precisão e escala na definição de campo é que eles representam valores máximos .

Exemplo, um campo decimal definido com precision=5e scale=2permitiria os seguintes valores:

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

Os seguintes valores não são permitidos ou causariam perda de dados:

  • 12.345(p = 5, s = 3) => pode ser truncado em 12.35(p = 4, s = 2)
  • 1234.56(p = 6, s = 2) => pode ser truncado em 1234.6(p = 5, s = 1)
  • 123.456(p = 6, s = 3) => pode ser truncado em 123.46(p = 5, s = 2)
  • 123450 (p = 6, s = 0) => fora da faixa

Observe que o intervalo geralmente é definido pela precisão: |value| < 10^p...

boumbh
fonte
5
Observe que o MS SQL Server não permitiria 12345 ou 1234.56 porque "[scale] é subtraído de [precision] para determinar o número máximo de dígitos à esquerda do ponto decimal". (fonte: decimal e numérico )
molnarm 17/02
Que tal 12345000? Precisão 5 ou 8? Se 5, com qual escala? Escala -3?
towi
@towi o que isso significa? Se você quisesse armazenar isso, usaria 8,0.
Rob Grant
Boa resposta, mas por que está 123450 (p=6,s=0)fora de alcance? 123450 tem 6 dígitos e nenhum dígito após um ponto?
Matthias Burger
1
@MatthiasBurger 123450 (p=6,s=0)estaria fora do intervalo para um campo decimal com precisão 5 (conforme mencionado no exemplo). Como a precisão de um número que você deseja armazenar em um campo deve ser menor ou igual à precisão do campo.
Snozzlebert 23/03/19
26

Precisão, escala e comprimento na documentação do SQL Server 2000:

Precisão é o número de dígitos em um número. Escala é o número de dígitos à direita da vírgula decimal em um número. Por exemplo, o número 123.45 tem uma precisão de 5 e uma escala de 2.

Chris
fonte
Obrigado. Eu só percebi que um pedaço de Delphi / code Pascal estava usando uma escala de 0 a cortar a parte decimal do flutuador
peterchaula