Ir para conteúdo
  • 0

Round() não está arredondando corretamente


LGustavo

Pergunta

  • Alunos

Boa tarde povo, eu estou com uma situação estranha quando uso o Round() no sql.

Quando uso Round para duas casas decimais, caso o terceiro decimal seja 5, ele não arredonda para cima.

Os cálculos que estou usando são os seguintes: 

(f.preco1 * f.qtde) * fs.desconto / fs.VrBrutoMercadorias as RateioDesconto,
round(((f.preco1 * f.qtde) * fs.desconto / fs.VrBrutoMercadorias),2)  as RateioDescontoRound,
(f.preco1 * f.qtde) / fs.VrBrutoMercadorias * fs.frete as RateioFrete,
(f.preco1 * f.qtde) - ((f.preco1 * f.qtde) * fs.desconto / fs.VrBrutoMercadorias) + ((f.preco1 * f.qtde) / fs.VrBrutoMercadorias * fs.frete) as ValorTotal,
Round((f.preco1 * f.qtde) - ((f.preco1 * f.qtde) * fs.desconto / fs.VrBrutoMercadorias) + ((f.preco1 * f.qtde) / fs.VrBrutoMercadorias * fs.frete),2) as ValorTotalRound

Eu vou colocar as imagens anexadas para vocês verem o que está acontecendo.

Reparem que na primeira linha, na coluna RateioDesconto o valor é 34,717 e na coluna RateioDescontoRound ele faz o arredondamento correto ficando em 34,72. Já na segunda linhada coluna RateioDesconto o valor é 60,095 e na RateioDescontoRound ele naõ faz o arredondamento e fica como 60,09.

Se reparem nas duas colunas, alguns tem o 5 como base para arredondamento e arredonda normal, e algumas que tem o 5 não arredondam. Alguém saberia me explicar o porque disso acontecer já que até onde eu saiba números <=5 teriam que arredondar para cima.

Captura de tela 2023-10-27 173539.png

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos
Em 03/11/2023 em 11:21, LGustavo disse:

Bom dia @champanjonata, desculpe a demora em responder, tive uns problemas com meu computador.

No anexo eu coloquei o meu banco só com as tabelas necessárias, views e procedures. Também em anexo a minha view que eu uso para importar no power bi.

Nessa view tem alguns campos que estão com o Round, esses campos não estão indo para o power bi, só coloquei para fazer uma comparação. Repare que quando executo o select, na segunda linha, a exemplo do que estou dizendo, a coluna ValorTotal possui o valor de 1141,805 e na ValorTotalRound fica com o valor 1141,8, sendo que o correto é ficar com o valor 1140,81 já que o 5 deveria arredondar pra cima.

Esse é o meu problema, sempre que o decimal de arredondamento é o 5, ele não arredonda, ele trunca os decimais, se o decimal de arredondamento for >= 6 ele arredonda correto pra cima e <= 4 ele arredonda pra baixo, mas quando é 5, deveria arredondar pra cima e não arredonda. O estranho é que se levo esse valores para o Power BI e uso o Round no DAX e Number.Round acontece a mesma coisa de o 5 não arredondar pra cima.

E como disse, eu já não sei o que fazer pra isso funcionar pois já tentei de tudo o que meu conhecimento limitado permite e não consigo resolver isso.

Captura de tela 2023-11-03 110940.png

SisFabDW.rar 14.39 MB · 0 downloads Select .txt 1.35 kB · 0 downloads

Olá Gustavo, segue a query como você espera. Observe a 'coluna': ValorTotalRound2, basicamente aumentei a precisão nas operações de multiplicação e depois no final coloquei apenas 2 casas...

image.png.5f3f949863d1185493c1e971d195d396.png

Select  
       'NF Venda' as TipoNF,
    'C' as TipoCredor,  
    fs.nf_saida as NFSaida, 
    fs.serie_nf as Serie, 
    fs.cod_empresa as CodEmpresa, 
    fs.cod_cliente as CodCliente,
    fs.cod_representante as CodRepresentante, 
    fs.emissao as DataEmissao, 
    fs.nf_cancelada as NFCancelada, 
    fs.NFEstornada as NFEstornada,
    fs.nf_devolvida as NFDevolvida, 
    f.produto as Referencia,
    f.qtde as Quantidade,
    f.preco1 as PrecoUnitario,
    f.qtde * f.preco1 as ValorBrutoMercadorias,
    round((f.qtde * f.preco1),2) as ValorBrutoMercadoriasRound,
    (f.preco1 * f.qtde) * fs.desconto / fs.VrBrutoMercadorias as RateioDesconto,
    round(((f.preco1 * f.qtde) * fs.desconto / fs.VrBrutoMercadorias),2) as RateioDescontoRound,
    (f.preco1 * f.qtde) / fs.VrBrutoMercadorias * fs.frete as RateioFrete,
    round(((f.preco1 * f.qtde) / fs.VrBrutoMercadorias * fs.frete),2) as RateioFreteRound,
    (f.preco1 * f.qtde) - ((f.preco1 * f.qtde) * fs.desconto / fs.VrBrutoMercadorias) + ((f.preco1 * f.qtde) / fs.VrBrutoMercadorias * fs.frete) as ValorTotal,
    round((f.preco1 * f.qtde) - ((f.preco1 * f.qtde) * fs.desconto / fs.VrBrutoMercadorias) + ((f.preco1 * f.qtde) / fs.VrBrutoMercadorias * fs.frete),2) as ValorTotalRound,
    round((round(f.preco1 * f.qtde, 4)) - round(((round(f.preco1 * f.qtde, 4)) * fs.desconto / fs.VrBrutoMercadorias), 4) + round(((round(f.preco1 * f.qtde, 4)) / fs.VrBrutoMercadorias * fs.frete), 4), 2) as ValorTotalRound2
from FaturamentoS Fs
INNER join FaturamentoProdS f on f.nf_saida = fs.nf_saida and f.cod_empresa = fs.cod_empresa
where fs.nf_saida = 10244

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Em 28/10/2023 em 09:38, Alex Pereira disse:

Qual sgdb está usando?

 

Tente verificar seus parênteses estão corretos você pode estar arredondado numero errado!

 

Um teste se pode fazer sgdb  e pegar uma contante e verificar como ele aredonda. Exemplo:

Select round (987.525,2)

Desculpe a demora em responder @Alex Pereira, eu uso o sql. Fiz como você disse e fiz com duas variáveis e duas constantes o resultado nas variáveis, é que não arredonda quando o ultimo número é 5 e nas contantes, arredonda certinho.

Captura de tela 2023-10-30 175544.png

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
6 horas atrás, Alex Pereira disse:

Tente usar um cte para fazer a sua query, ai você armazena o resultado da query em um cte e depois usa a função round quando for chamar!

https://www.alura.com.br/artigos/cte-o-que-e-para-que-serve-sql

Tentei aqui e sem sucesso. Já não sei o que fazer pq se eu uso o ROUND no SQL, as somas que o terceiro número decimal é igual a 5, ele não arredonda pra cima, quando for qualquer outro número os arredondamentos vão certinhos. Se eu uso o Number.Round no PQ, acontece o mesmo caso do ROUND no SQL, se uso em uma medida com ROUND, os totais dos números que ele não arredonda no SQL, ele arredonda na medida, mas os números que eu arredondava no PQ ou no SQL ficam errados.

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
2 horas atrás, LGustavo disse:

Tentei aqui e sem sucesso. Já não sei o que fazer pq se eu uso o ROUND no SQL, as somas que o terceiro número decimal é igual a 5, ele não arredonda pra cima, quando for qualquer outro número os arredondamentos vão certinhos. Se eu uso o Number.Round no PQ, acontece o mesmo caso do ROUND no SQL, se uso em uma medida com ROUND, os totais dos números que ele não arredonda no SQL, ele arredonda na medida, mas os números que eu arredondava no PQ ou no SQL ficam errados.

Olá LGustavo, tudo certo?

Qual banco de dados você utiliza (SQL server, postgresql, mysql... etc)?

Consegue disponiblizar um dump/backup de parte dos registros para testes?

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Bom dia @champanjonata, desculpe a demora em responder, tive uns problemas com meu computador.

No anexo eu coloquei o meu banco só com as tabelas necessárias, views e procedures. Também em anexo a minha view que eu uso para importar no power bi.

Nessa view tem alguns campos que estão com o Round, esses campos não estão indo para o power bi, só coloquei para fazer uma comparação. Repare que quando executo o select, na segunda linha, a exemplo do que estou dizendo, a coluna ValorTotal possui o valor de 1141,805 e na ValorTotalRound fica com o valor 1141,8, sendo que o correto é ficar com o valor 1140,81 já que o 5 deveria arredondar pra cima.

Esse é o meu problema, sempre que o decimal de arredondamento é o 5, ele não arredonda, ele trunca os decimais, se o decimal de arredondamento for >= 6 ele arredonda correto pra cima e <= 4 ele arredonda pra baixo, mas quando é 5, deveria arredondar pra cima e não arredonda. O estranho é que se levo esse valores para o Power BI e uso o Round no DAX e Number.Round acontece a mesma coisa de o 5 não arredondar pra cima.

E como disse, eu já não sei o que fazer pra isso funcionar pois já tentei de tudo o que meu conhecimento limitado permite e não consigo resolver isso.

Captura de tela 2023-11-03 110940.png

SisFabDW.rar Select .txt

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Uma coisa que eu testei é colocando duas variáveis decimais com valor fixo de 1141,805, uma com o Round e outra sem o Round, dessa vez a com Round arredondou certinho. Ai eu tentei criar duas variáveis com os cálculos que eu fiz no select e ela soma os valores ao invés de colocar os valores linha a linha.

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...