Arredondamento
-
- Rank: Estagiário Sênior
- Mensagens: 10
- Registrado em: Qua, 17 Fev 2010 10:15 am
- Localização: Carambeí - PR
Olá.
Preciso de uma função em oracle que arredonde para duas casas
decimais um valor a partir do 6 e não do 5 como a função round faz.
Ex1: 12.545 preciso que fique 12,54
Ex2: 12.546 preciso que fique 12,55
Se alguém puder me ajudar fico muito agradecido.
Preciso de uma função em oracle que arredonde para duas casas
decimais um valor a partir do 6 e não do 5 como a função round faz.
Ex1: 12.545 preciso que fique 12,54
Ex2: 12.546 preciso que fique 12,55
Se alguém puder me ajudar fico muito agradecido.
-
- Moderador
- Mensagens: 1177
- Registrado em: Qui, 15 Out 2009 10:28 am
- Localização: Recife
round(numero,2)
-
- Rank: Estagiário Sênior
- Mensagens: 10
- Registrado em: Qua, 17 Fev 2010 10:15 am
- Localização: Carambeí - PR
O round eu conheço.
Com round(12.545,2), tenho o retorno: 12.55, preciso
que retorne 12.54.
Deve arredondar para cima somente a partir do 6...
Com round(12.545,2), tenho o retorno: 12.55, preciso
que retorne 12.54.
Deve arredondar para cima somente a partir do 6...
-
- Rank: Oracle Guru
- Mensagens: 448
- Registrado em: Ter, 16 Jun 2009 3:07 pm
- Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS
[]s
Programador Junior
Parobé RS
[]s
Cara não conheço nada pronto.
Mas pensei em algo tipo.
tenta aí, o lpad ali pe pra poder trabalhar com numeros maiores.
Mas pensei em algo tipo.
SELECT CASE WHEN (SUBSTR(TO_CHAR(LPAD(&numero,10,0)),10,1) <= 5) THEN TRUNC(&numero,2) ELSE ROUND(&numero,2) END FROM dual
-
- Rank: Oracle Guru
- Mensagens: 448
- Registrado em: Ter, 16 Jun 2009 3:07 pm
- Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS
[]s
Programador Junior
Parobé RS
[]s
só que tu fica limitado pelas tuas casas decimais deste jeito 

- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
É só deslocar o arredondamento subtraindo o offset de 0.001
Se você quiser algo mais flexível, que possa mudar o número de casas decimais, simplesmente coloque uma variável no lugar e use a expressão abaixo:
Se você quiser algo mais flexível, que possa mudar o número de casas decimais, simplesmente coloque uma variável no lugar e use a expressão abaixo:
select numero,
round(numero - (1 / power(100, &casas_decimais)), &casas_decimais) round
from t;
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Exemplo para arredondar para 2 casas decimais:
SQL> with t as (
2 select (level + 12538) / 1000 numero from dual connect by level <= 15)
3 -- fim dos dados de teste
4 select numero,
5 round(numero - (1 / power(100, &casas_decimais)), &casas_decimais) round
6 from t;
NUMERO ROUND
---------- ----------
12,539 12,54
12,54 12,54
12,541 12,54
12,542 12,54
12,543 12,54
12,544 12,54
12,545 12,54
12,546 12,55
12,547 12,55
12,548 12,55
12,549 12,55
12,55 12,55
12,551 12,55
12,552 12,55
12,553 12,55
15 rows selected
SQL>
-
- Rank: Estagiário Sênior
- Mensagens: 10
- Registrado em: Qua, 17 Fev 2010 10:15 am
- Localização: Carambeí - PR
Pessoal, esses dois últimos exemplos que foram postados não se comportaram como o esperado, simulei aqui:
Passando para variável &numero = 1.1555
Passando para variável &casas_decimais = 2
Tiver o Retorno do número = 1.16
E neste caso o que preciso obter é 1.15
Muito obrigado mesmo pela colaboração de todos.
select &numero,
round(&numero - (1 / power(100, &casas_decimais)), &casas_decimais) round
from dual;
Passando para variável &casas_decimais = 2
Tiver o Retorno do número = 1.16
E neste caso o que preciso obter é 1.15
Muito obrigado mesmo pela colaboração de todos.
-
- Rank: Estagiário Sênior
- Mensagens: 10
- Registrado em: Qua, 17 Fev 2010 10:15 am
- Localização: Carambeí - PR
Baseado nas dicas dos colegas, criei a seguinte função, pelos testes que realizei parece funcionar bem:
-- Author : ROGERIO P.
-- Created : 18/02/2010 13:48:50
-- Purpose : Arredonda para cima a partir do 6
create or replace function round6(p_vl_x number
,p_nr_casas number) return number is
va_vl_x number := p_vl_x;
va_nr_lpad constant number := 60;
va_valor_string varchar2(60) := lpad(va_vl_x,va_nr_lpad,0);
va_nr_decimais number := length(substr(va_valor_string,instr(va_valor_string,'.')+1,20));
begin
if p_nr_casas < 0 or -- Se Números de Casas Menor que Zero ou
instr(va_valor_string,'.') = 0 or -- Se não possuir Decimal ou
p_nr_casas >= va_nr_decimais then -- Se Número de Casas solicitada maior/igual ao número de Decimais
return (va_vl_x); -- Retorna valor sem arredondamento
else
loop
va_nr_decimais := va_nr_decimais - 1;
if substr(va_valor_string,va_nr_lpad,1) <= 5 then
va_vl_x := trunc(va_vl_x,va_nr_decimais);
else
va_vl_x := round(va_vl_x,va_nr_decimais);
end if;
va_valor_string := lpad(va_vl_x,va_nr_lpad,0);
exit when va_nr_decimais <= p_nr_casas;
end loop;
return (va_vl_x);
end if;
end;
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
math fail pra mim...
Testa o seguinte por favor, Rogerio:
Testa o seguinte por favor, Rogerio:
select &numero,
round(&numero - (power(10, - 1 * (&casas_decimais + 1))), &casas_decimais) round
from t;
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
estou terrível... substitui o maldito T por dual...

select &numero,
round(&numero - (power(10, - 1 * (&casas_decimais + 1))), &casas_decimais) round
from dual;
-
- Rank: Estagiário Sênior
- Mensagens: 10
- Registrado em: Qua, 17 Fev 2010 10:15 am
- Localização: Carambeí - PR
Olá.
Este exemplo simplificado continua com problema:
Passei o número 10.155556 com 2 casas decimais.
Retornou: 10.15, quando o esperado seria 10.16.
Abraço.
Este exemplo simplificado continua com problema:
select &numero,
round(&numero - (power(10, - 1 * (&casas_decimais + 1))), &casas_decimais) round
from DUAL;
Retornou: 10.15, quando o esperado seria 10.16.
Abraço.
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Como curiosidade, está funcionando para números negativos também, conforme esperado pelo ROUND:
SQL> var casas_decimais number
SQL> exec :casas_decimais := -1
PL/SQL procedure successfully completed
casas_decimais
---------
-1
SQL> with t as (
2 select 15 as numero from dual union all
3 select 16 from dual)
4 -- fim dos dados de teste
5 select numero,
6 round(numero - (power(10, - 1 * (:casas_decimais + 1))), :casas_decimais) round
7 from t;
NUMERO ROUND
---------- ----------
15 10
16 20
casas_decimais
---------
-1
SQL>
-
- Rank: Estagiário Sênior
- Mensagens: 10
- Registrado em: Qua, 17 Fev 2010 10:15 am
- Localização: Carambeí - PR
Enviada: Qui, 18 Fev 2010 2:35 pm Assunto: Teste
--------------------------------------------------------------------------------
Olá.
Este exemplo simplificado continua com problema:
Passei o número 10.155556 com 2 casas decimais.
Retornou: 10.15, quando o esperado seria 10.16.
Abraço.
--------------------------------------------------------------------------------
Olá.
Este exemplo simplificado continua com problema:
select &numero,
round(&numero - (power(10, - 1 * (&casas_decimais + 1))), &casas_decimais) round
from DUAL;
Retornou: 10.15, quando o esperado seria 10.16.
Abraço.
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Já chego lá... volta de carnaval é f***... respondo depois que eu tomar um café.
-
- Rank: Estagiário Sênior
- Mensagens: 10
- Registrado em: Qua, 17 Fev 2010 10:15 am
- Localização: Carambeí - PR
Toma seu café aí.
Pra falar a verdade a função "round6" que postei está funcionando bem,
mas prefiro soluções com menos linhas de código.
Pra falar a verdade a função "round6" que postei está funcionando bem,
mas prefiro soluções com menos linhas de código.
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Umm... Bom, de volta ao contexto...
Cara, pelo que notei, nesse caso que você está falando acima, 10.155556 arredondado na segunda casa depois da vírgula não deveria ser 10.16 ... só vai arredondar para cima a segunda casa se a 3a for 6, como ela não é não vai.
Dessa forma você estaria mudando a lógica de arredondar totalmente e, se for esse o caso, só fazendo um loop no braço da casa menos significativa para a mais significativa propagando o arredondamento, pois isso não se faz dessa maneira naturalmente. Observe o exemplo abaixo:
Apenas se a 3a casa decimal for um 5 ele vai jogar a 2a casa para cima.
Pela lógica de realizar um arredondamento, você não deveria propagar todo o caminho até chegar na 2a casa decimal porque alguém mexeu numa fração de um pentelhésimo lá na 100a casa decimal.
Seria algo como realizar um arredondamento recursivo para cima. Você tem certeza que é assim que precisa ser?

Cara, pelo que notei, nesse caso que você está falando acima, 10.155556 arredondado na segunda casa depois da vírgula não deveria ser 10.16 ... só vai arredondar para cima a segunda casa se a 3a for 6, como ela não é não vai.
Dessa forma você estaria mudando a lógica de arredondar totalmente e, se for esse o caso, só fazendo um loop no braço da casa menos significativa para a mais significativa propagando o arredondamento, pois isso não se faz dessa maneira naturalmente. Observe o exemplo abaixo:
SQL> with t as (
2 select 10.1444445 as numero from dual union all
3 select 10.144445 as numero from dual union all
4 select 10.14445 as numero from dual union all
5 select 10.1445 as numero from dual union all
6 select 10.145 from dual)
7 -- fim dos dados de teste
8 select numero,
9 round(numero, 2) round
10 from t;
NUMERO ROUND
---------- ----------
10,1444445 10,14
10,144445 10,14
10,14445 10,14
10,1445 10,14
10,145 10,15
SQL>
Pela lógica de realizar um arredondamento, você não deveria propagar todo o caminho até chegar na 2a casa decimal porque alguém mexeu numa fração de um pentelhésimo lá na 100a casa decimal.
Seria algo como realizar um arredondamento recursivo para cima. Você tem certeza que é assim que precisa ser?
-
- Rank: Estagiário Sênior
- Mensagens: 10
- Registrado em: Qua, 17 Fev 2010 10:15 am
- Localização: Carambeí - PR
8)
Sabe que nunca tinha atentado para essas questoes do round.
Dessa forma a sua solução parece funcionar bem.
Muito obrigado.
Sabe que nunca tinha atentado para essas questoes do round.
Dessa forma a sua solução parece funcionar bem.
Muito obrigado.
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
De nada.
Eu já tava perdendo cabelos pensando em model... felizmente não vai precisar.
Eu já tava perdendo cabelos pensando em model... felizmente não vai precisar.

-
- Rank: Estagiário Sênior
- Mensagens: 10
- Registrado em: Qua, 17 Fev 2010 10:15 am
- Localização: Carambeí - PR
Teu código está funcionando muito bem.
A título de curiosidade, como eu não tinha me ligado nestas
questões de arredondamento, a função que fiz faz o tratamento
"se precisar" da última casa decimal e traz até a solicitada sempre
realizando o arredondamento.
Ex.: 1.45555556 com duas casas traz para 1.46 por isso o código ficou
meio extenso.
Valeu! Abraço.
A título de curiosidade, como eu não tinha me ligado nestas
questões de arredondamento, a função que fiz faz o tratamento
"se precisar" da última casa decimal e traz até a solicitada sempre
realizando o arredondamento.
Ex.: 1.45555556 com duas casas traz para 1.46 por isso o código ficou
meio extenso.
Valeu! Abraço.
Faz assim;
SELECT (ceil((12.5452) * 100) )/100, 12.5452 FROM
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes