Incrementar última casa decimal

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
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Pessoal,

Essa semana passei por uma situação, que dei uma pesquisada rápida mas não achei uma solução, pelo menos decente. Eu precisava fazer o incremento de um valor, que tinha 9 casas decimais depois da virgula, ou seja, imagina que fosse 2,123456789, eu precisava incrementar a casa decimal "9", mas queria deixar o script dinâmico, a ponto de, se tiver 9 casas decimais, ele incremente a nona casa decimal. Se a variável tiver 5 casas decimais, ex.: 1,23456, ele incremente a casa decimal "6", ou seja, sempre a última.

Como vocês fariam isso dinamicamente ?

[ ]s
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

Você quer arredondar a última casa decimal ? Ou quer SEMPRE incrementar? (não importando o valor).
Exemplo: Digamos que você tem 10,1234321
Você quer que o resultado seja 10,1234322 ?
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Incrementar dr_gori, igual o exemplo que você deu, mas com um porém, pode ser que depois da virgula tenha 5 casas ou 9 casas !!!
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

Eu fiz assim:

Selecionar tudo

with n as (select 10.1234567  numero from dual)
select 
  numero
, numero + 1/power(10, length(numero-trunc(numero))-1 ) incrementado
from n;

Você pode colocar qualquer número ali onde está o 10.1234567.
Inclusive funciona pra números negativos.

Selecionar tudo

SQL> with n as (select 10.1234567  numero from dual)
  2  select
  3    numero
  4  , numero + 1/power(10, length(numero-trunc(numero))-1 ) incrementado
  5  from n;

    NUMERO INCREMENTADO
---------- ------------
10.1234567   10.1234568

SQL> 
SQL> 
SQL> with n as (select 3.6543  numero from dual)
  2  select
  3    numero
  4  , numero + 1/power(10, length(numero-trunc(numero))-1 ) incrementado
  5  from n;

    NUMERO INCREMENTADO
---------- ------------
    3.6543       3.6544

SQL> 
:-o
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Show dr_gori,

Vou dar uma estudada no seu script, para entender a lógica ;)

Muito 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

Eu usei a seguinte lógica:

Digamos que o número é 12.3456.

Primeiro, eu descubro quantos dígitos tem depois da vírugla.
No caso:

Selecionar tudo

length(numero-trunc(numero))-1
Ou seja, TRUNC ( 12.3456 ) é igual a 12.
Portanto, 12.3456 - 12 = .3456

Daí eu faço o LENGTH pra saber quantos dígitos:
LENGTH ( .3456 ) - 1 = 4 (ou seja, 4 digitos. O -1 é pra tirar fora o ponto).

Agora que eu sei que tem 4 dígitos, eu faço:
1 / (10 elevado ao número de dígitos). Este é o valor que eu vou somar.
Veja:
1 / (10 ^ 4 ) =
1 / ( 10000 ) = 0.0001

Daí basta somar esse número ao valor inicial.
12.3456 + 0.0001 = 12.3457

Se o número original tivesse 2 casas decimais, ele ia somar 0.01.
Se tivesse 6 casas decimais, somaria 0.000001

:-o
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Show... Não tinha entendido realmente o power (Potência).

Perfeito... Valeu man ;)
Responder
  • Informação
  • Quem está online

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