Precisão Numérica

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
alphasux
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 28 Jul 2014 12:13 pm

estou diante de uma situação aqui e gostaria da sua opinião e se possível alguma sugestão para correção do 'problema'.

Tenho na origem um NUMBER 19,2 e através de um INSERT AS SELECT feito nessa origem tenho o destino uma coluna NUMBER 24,7 porém quando roda o INSERT se o valor inteiro for um número muito grande está 'zuando' a parte fracionária do número. Constatei que através de INSERT "puro" o comportamento também ocorre.

Tentei usar o tipo BINARY_DOUBLE mas vi que ele omite as casas decimais quando não há valor, esse tipo é recomendado em quais situações ?

Segue exemplo...

Selecionar tudo

create table alberi ( valor_number number( 24,7 ), valor_binary binary_double  );
insert into alberi values (2662468067.8900000, 2662468067.8900000);
insert into alberi values (   2468067.8900000,    2468067.8900000);
insert into alberi values (2662468067.9900000, 2662468067.9900000);
insert into alberi values (3123798559.4000000, 3123798559.4000000);
insert into alberi values (2662468067.8944444, 2662468067.8944444);
insert into alberi values (2662468067.8955555, 2662468067.8955555);
insert into alberi values (2662468067.8966666, 2662468067.8966666);
select * from alberi;
drop table alberi;
Note que o primeiro e o segundo INSERT só muda o tamanho da parte inteira... quando o valor é nessa escala, após a virgula apresenta um comportamento esquisito (vide o 3 e o 4 INSERT).

Imagino que o problema seja de exibição, se eu aplico um TO_CHAR com máscara eu consigo recuperar o número conforme foi inserido.

Porém no código fonte durante execução está acontecendo o problema também.... eu tenho uma subtração que deveria dar zero e que por conta desse problema não está ficando 0 pois um valor está como 3123798559,4000001 e o outro 3123798559,4099999 e dai ferra meu cálculo... esses dois números são somatórios de fontes distintas... mas teriam que zerar ao fazer a subtração.

Obrigado.
Editado pela última vez por stcoutinho em Ter, 29 Jul 2014 6:57 pm, em um total de 1 vez.
Razão: (revisado para facilitar a tradução automática ao inglês)
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá alphasux,

Ben-vindo ao forum GLUFKE !

Reproduzi o exemplo que me passou e me deparei com os resultados mencionados. Você precisa aplicar mesmo TO_CHAR para obter o valor correto:
imagem01a.JPG
imagem02a.JPG
imagem03a.JPG
Agora, o valor que você está tentando subtrair e que veio de "outra fonte". Esta fonte seria outra tabela do banco de dados, um arquivo texto, um valor da camada de aplicação, um DBLINK apontando para outro banco de dados (oracle de release diferente, um sqlserver, mysql, etc), um external table ?

Dependendo do caso (especialmente se for outro banco de dados) é provável que ocorram diferenças de cálculo. Pode ser que para ele, o valor realmente seja aquele (com decimais diferentes).

Se a origem for outra tabela, há como você complementar seu exemplo, para que os foristas possam reproduzir o mesmo e efetuar os cálculos de subtração?

Abraços,

Sergio
Responder
  • Informação
  • Quem está online

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