De acordo com a documentação da Oracle:
Aqui está como eu vejo:
- Quando
Precision
é maior que Escala (por exemplo,NUMBER(8,5)
), não há problema, isso é simples.Precision
significa que o número terá um total de 8 dígitos, dos quais 5 estão na parte fracionária (.→), então a parte inteira (←.) terá 3 dígitos. Isso é fácil. -
Quando você vê quePrecision
é menor queScale
(por exemplo,NUMBER(2, 5)
), isso significa 3 coisas:
- O número não terá parte inteira, apenas parte fracionária. Então o 0 na parte inteira não é contado nos cálculos, você diz 0,12345 e não 0,12345. Na verdade, se você especificar apenas 1 dígito na parte inteira, sempre retornará um erro.
- A
Scale
representa o número total de dígitos na parte fracionária que o número terá. 5 neste caso. Portanto, pode ser 0,12345 ou 0,00098, mas não pode ter mais de 5 dígitos no total. - A parte fracionária é dividida em 2 partes, números significativos e zeros. Números significativos são especificados por
Precision
, e o número mínimo de zeros é igual (Scale
-Precision
). Exemplo:
aqui O número deve ter no mínimo 3 zeros na parte fracionária. seguido por 2 números significativos (pode ter um zero também). Portanto, 3 zeros + 2 números significativos =5, que é aScale
número.
Em resumo, quando você vê, por exemplo,
NUMBER(6,9)
, isso nos diz que a parte fracionária terá 9 dígitos no total, começando por 3 zeros obrigatórios e seguidos por 6 dígitos. Aqui estão alguns exemplos :
SELECT CAST(.0000123 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012300
SELECT CAST(.000012345 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012345
SELECT CAST(.123456 AS NUMBER(3,4)) FROM dual; -- ERROR! must have a 1 zero (4-3=1)
SELECT CAST(.013579 AS NUMBER(3,4)) FROM dual; -- prints: 0.0136; max 4 digits, .013579 rounded to .0136