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:
- declare @vl decimal(19,9)
- select @vl = 2.4567
- select convert(decimal(12, 2), round(@vl, 2)) as 'arredondado'
- , convert(decimal(12, 2), round(@vl, 2, 1)) as 'truncado'
- , convert(decimal(12, 2), @vl) as 'convertido'
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().
Muito obrigado pela informação, foi de muita valia.
ResponderExcluirParabéns.
Muito bom, ajudou muito.
ResponderExcluirComo faz para arredondar sempre para cima? Ou seja, 2,1 arredondar para 3 ao invés de 2?
ResponderExcluirUtilize a função ceiling:
Excluirselect ceiling(45.01) => resulta em 46
select ceiling(45.99) => resulta também em 46.
Abraços!