Pesquisar este blog

sábado, 25 de fevereiro de 2012

Round() – Arredondar ou truncar os decimais?

 

      Esta dica vai para todos os colegas que trabalham com SQL Server e precisam trabalhar arredondamentos. Creio que a maioria dos programadores sql conhecem a função ROUND() que faz o arredondamento de casas decimais de um determinado número. Porém, há alguns dias atrás, precisei de um resultado um pouco diferente… como estamos alterando algumas funções que envolvem a emissão de nota fiscal eletrônica, o tratamento aplicado nos valores exigiu uma extensão do comando ROUND() que talvez muita gente não conheça, mas extremamente útil.

      Em uma nova fiscal eletrônica, todos os valores unitários devem conter 4 casas decimais. Porém os totais e valores de impostos devem ser apenas com 2 casas. E tem mais um detalhe: na multiplicação da quantidade pelo valor unitário, o valor total não deve ser arredondado, e sim ter seus decimais “truncados”.

 

Exemplo:

original = 2,4567
arredondado = 2,46
truncado = 2,45

 

Já vi muitos códigos inusitados para realizar esta tarefa. Funções cabulosas e cheias de “if”. Mas aqui vai a dica, vamos entender melhor o comando round():

 

- Sintaxe


ROUND (numeric_expression , length [ ,function ] )

- Argumentos






numeric_expression

É uma expressão da categoria de tipo de dados numéricos exatos ou aproximados, com exceção do tipo de dados bit.


length

É a precisão à qual a numeric_expression deve ser arredondada. length deve ser uma expressão do tipo tinyint, smallint ou int. Quando length for um número positivo, numeric_expression é arredondada para o número de posições decimais especificado por length. Quando length for um número negativo, numeric_expression é arredondada no lado esquerdo do ponto decimal, conforme especificado por length.


function

É o tipo de operação a ser executada. function deve ser tinyint, smallintou int. Quando function é omitido ou tem um valor 0 (padrão), a numeric_expression é arredondada. Quando um valor diferente de 0 é especificado, numeric_expression é truncado.


(fonte: msdn)


 


Veja um exemplo abaixo:


 






  1.   declare @vl decimal(19,9)
  2.   
  3.   select @vl = 2.4567
  4.   
  5.   select convert(decimal(12, 2), round(@vl, 2)) as 'arredondado'
  6.        , convert(decimal(12, 2), round(@vl, 2, 1)) as 'truncado'
  7.        , convert(decimal(12, 2), @vl) as 'convertido'


 image



Coloquei também uma terceira coluna, onde somente converto para decimal(12,2), porém o SQL por padrão arredonda. A forma mais eficiênte é através do comando Round().


 


sorriso_161  That’s all folks!

4 comentários:

  1. Muito obrigado pela informação, foi de muita valia.

    Parabéns.


    ResponderExcluir
  2. Como faz para arredondar sempre para cima? Ou seja, 2,1 arredondar para 3 ao invés de 2?

    ResponderExcluir
    Respostas
    1. Utilize a função ceiling:

      select ceiling(45.01) => resulta em 46
      select ceiling(45.99) => resulta também em 46.

      Abraços!

      Excluir