Datatype NUMBER(n,m)

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
viniciusandrade
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Ter, 19 Jul 2011 5:50 pm
Localização: Jataí - GO

Olá!

Na internet encontro várias páginas explicando sobre o tipo NUMBER, porém não consigo entendê-lo na prática.

NUMBER(n,m) : onde n é a quantidade de dígitos (antes e depois da vírgula) e m é a quantidade de dígitos após a virgula.

Porém se eu tenho NUMBER(3,2) e tento inserir (92.9) dá erro. Mas não tenho exatamente 3 dígitos no total?

Se tenho NUMBER(3,2) e tento inserir (2.2333333333333333333333333) dá certo. Mas não posso ter só 3 dígitos?

Se tenho NUMBER(2,2) e tento inserir (1.1) dá erro. Mas não tenho exatamente dois dígitos?

Alguém pode me explicar melhor isso?
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Olá Vinivios, vou tentar lhe esplanar sobre o tipo Number.
NUMBER(n,m) : onde n é a quantidade de dígitos (antes e depois da vírgula) e m é a quantidade de dígitos após a virgula.
Isto esta correto
Porém se eu tenho NUMBER(3,2) e tento inserir (92.9) dá erro. Mas não tenho exatamente 3 dígitos no total?
Sim, o total é 3 digitos, mas segundo sua especificação você OBRIGATORIAMENTE tem 2 digitos decimais e apenas 1 inteiro.
Se tenho NUMBER(3,2) e tento inserir (2.2333333333333333333333333) dá certo. Mas não posso ter só 3 dígitos?
Experimente ler o que foi consolidado no banco. Mesmo você inserindo 500 digitos decimais, o valor sera arredondado para apenas 2 decimais.
Se tenho NUMBER(2,2) e tento inserir (1.1) dá erro. Mas não tenho exatamente dois dígitos?
Novamente, não é apenas o valor total de digitos que importa e sim a obrigatoriedade de decimais. Se você especificar "2,2" você nunca teria numeros inteiros apenas 2 decimais. Para inserir 1.1 deveria estar especificado Number (2,1).

Conseguiu entender?
viniciusandrade
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Ter, 19 Jul 2011 5:50 pm
Localização: Jataí - GO

Vamos ver se eu entendi:

Quando você disse "Se você especificar "2,2" você nunca teria numeros inteiros apenas 2 decimais", quis dizer que vou ter dois digitos, mas os dois seriam decimais. Exemplo (0.33). Certo?

Quando você disse "Para inserir 1.1 deveria estar especificado Number (2,1)", quis dizer que 1.1 são dois digitos sendo que um é decimal, logo (2,1). Certo?

Quando você disse "segundo sua especificação você OBRIGATORIAMENTE tem 2 digitos decimais e apenas 1 inteiro". Quer dizer que se o campo é (3,2) devo ter 3 dígitos, mas dois devem obrigatóriamente ser decimais?

Se for assim é estranho porque no campo (3,2) eu deveria ter 2 dígitos decimais, mas se eu inserir apenas o valor (2) sem decimais, dá certo.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Se for assim é estranho porque no campo (3,2) eu deveria ter 2 dígitos decimais, mas se eu inserir apenas o valor (2) sem decimais, dá certo.
quando você insere 2 em um campo (3,2), o banco 2,00 no banco.
viniciusandrade
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Ter, 19 Jul 2011 5:50 pm
Localização: Jataí - GO

Gfkauer, e para essa situação NUMBER(n, -m). Sabe me dizer como funciona esse m negativo?

Vi que se eu criar um campo NUMBER(5,-2) e inserir (1056.34), o oracle registra 1100. Sabe porque?
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

O valor negativo arredonda a parte inteira do número para o valor mais próximo do valor / 10^|m|.
Para m = -2, como no seu exemplo, o número é arredondado para o valor mais próximo divisível por 100.
Para m = 5, seria o valor mais próximo do número divisível por 10.000.
viniciusandrade
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Ter, 19 Jul 2011 5:50 pm
Localização: Jataí - GO

Rafael, eu entendi a questão do arredondamento, porém como fica a questão da quantidade de dígitos?

Para NUMBER(5,3) eu só posso ter um valor com dois dígitos antes da vírgula e três dígitos depois da vírgula. Ex: 12.345.

Para NUMBER(5,-3), não deveria aceitar apenas um valor com 5 dígitos também? Se eu tentar inserir (12345678.26) ele registra (12346000) com 8 dígitos.

Obrigado.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Na realidade o 5 tem a ver com precisão.
Se você usar NUMBER(5,-3) com o número 12345678.26 ele te mostra 12345000.

Se você for pensar, isso só gasta 5 dígitos e não 8. Veja:

12345000 = 12345*10^3

É mais ou menos isso que ele faz.
NUMBER(x,y) == Sendo x a quantidade de dígitos que ele vai guardar. O outro indica em que "faixa" será usado...

Este conceito se aprende em matemática discreta. Toda calculadora trabalha dessa forma. As calculadoras só mostram 8 digitios, mas elas conseguem calcular valores com até 99 casas decimais.. Normalmente, o resultado fica 1.123432E30, indicando que é 1.2345*10^30.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes