Oi! Seja bem-vindo!
Hoje nosso assunto é round vs trunc: Arredondamento no SQL Server. Para trazermos essa questão para a prática, na vídeo aula de hoje vou te mostrar como conferir o imposto de aplicações financeiras.
O interessante de temas como esse é que vai além do SQL Server, afinal, matemática e lógica são parte fundamental da tecnologia e de como servimos a nossos usuários e empresas.
Round vs Trunc (arredondamento financeiro)
A diferença dessas duas estratégias de arredondamento numérico é bem
ROUND
Arredonda o valor para cima, quando a casa decimal for maior ou igual a 5, e para baixo, quando a casa decimal for menor que 5. Veja o funcionamento em exemplos variados:
Round com casas decimais positivas. Exemplo: 1 (primeira casa decimal), 4 (quarta casa decimal), 5 (quinta casa decimal):
-- Sintaxe: round(número, casa-decimal) select round(123456789.123456789, 1) as [round(123456789.123456789, 1)], round(123456789.123456789, 4) as [round(123456789.123456789, 4)], round(123456789.123456789, 5) as [round(123456789.123456789, 5)]
round(123456789.123456789, 1) | round(123456789.123456789, 4) | round(123456789.123456789, 5) |
---|---|---|
123456789.100000000 | 123456789.123500000 | 123456789.123460000 |
Round com a casa decimal 0:
select round(123456789.123456789, 0) as [round(123456789.123456789, 0)]
round(123456789.123456789, 0) |
---|
123456789.000000000 |
Round com a casas decimais negativas (segue a mesma lógica, porém atua a esquerda da vírgula e não a direita):
select round(123456789.123456789, -1) as [round(123456789.123456789, -1)], round(123456789.123456789, -2) as [round(123456789.123456789, -4)], round(123456789.123456789, -3) as [round(123456789.123456789, -5)]
round(123456789.123456789, -1) | round(123456789.123456789, -4) | round(123456789.123456789, -5) |
---|---|---|
123456790.000000000 | 123456800.000000000 | 123457000.000000000 |
TRUNC
Elimina os números de uma casa decimal para frente. Abaixo exemplos:
Trunc com casas decimais positivas:
-- Sintaxe: round(número, casa-decimal, 1) -- 1 indica trunc ao invés de round select round(123456789.123456789, 1, 1) as [trunc(123456789.123456789, 1)], round(123456789.123456789, 4, 1) as [trunc(123456789.123456789, 4)], round(123456789.123456789, 5, 1) as [trunc(123456789.123456789, 5)]
trunc(123456789.123456789, 1) | trunc(123456789.123456789, 4) | trunc(123456789.123456789, 5) |
---|---|---|
123456789.100000000 | 123456789.123400000 | 123456789.123450000 |
Trunc na casa decimal 0:
select round(123456789.123456789, 0, 1) as [trunc(123456789.123456789, 0)]
trunc(123456789.123456789, 0) |
---|
123456789.000000000 |
Trunc com a casas decimais negativas:
select round(123456789.123456789, -1, 1) as [trunc(123456789.123456789, -1)], round(123456789.123456789, -4, 1) as [trunc(123456789.123456789, -4)], round(123456789.123456789, -5, 1) as [trunc(123456789.123456789, -5)]
trunc(123456789.123456789, -1) | trunc(123456789.123456789, -4) | trunc(123456789.123456789, -5) |
---|---|---|
123456780.000000000 | 123450000.000000000 | 123400000.000000000 |
Round vs Trunc: Prática
A essa altura talvez você esteja se perguntando: Para que serve esse tal TRUNC?
Para te ser sincero eu também não sabia, até atender clientes do setor bancário, onde essa função é usada em alguns cálculos. Um dos exemplos, é o cálculo de imposto de renda sobre aplicações financeiras.
Para te mostrar um exemplo, fui até o site http://www.sofisadireto.com.br/rentabilidade/ e simulei um investimento de 10 mil reais.
Para validarmos o valor do imposto a pagar, basta usarmos a fórmula do governo:
Imposto a Pagar = Rendimento da Aplicação * Alíquota de imposto para o prazo
A alíquota é definida pela tabela abaixo:
prazo | percentual |
---|---|
entre 0 e 6 meses | 22.5% |
entre 6 e 12 meses | 20.0% |
entre 12 e 24 meses | 17.5% |
superior a 24 meses | 15.0% |
De posse da fórmula e da tabela, podemos calcular o imposto para cada um dos prazos. Quando você chegar ao prazo de 18 meses, verá que se arredondar o resultado da fórmula de cálculo o valor não fechará, conforme exemplo que mostrei no vídeo:
1252.05 * 0.175 – Sem Arredondamentos | 1252.05 * 0.175 – Round | 1252.05 * 0.175 – Trunc |
---|---|---|
219.10875 | 219.11000 | 219.10000 |
Isso ocorre porque o cálculo de impostos usa TRUNC e não ROUND. 🙂
Round vs Trunc: Script completo
Para concluirmos, aqui vai o script completo usado no vídeo:
------------------------------------------------------------------ -- Round vs Trunc (Arredondamento financeiro) ------------------------------------------------------------------ -------------------------------------------------- -- Round vs. Truncate -------------------------------------------------- -- Round: Arredonda para cima ou para baixo -- Trunc: Elimina os algarismos select 'Round 1.4 = 1' = round(1.4, 0), 'Round 1.6 = 2' = round(1.6, 0), 'Trunc 1.4 = 1' = round(1.4, 0, 1), 'Trunc 1.6 = 1' = round(1.6, 0, 1) -------------------------------------------------- -- Teste prático: validar cálculo de imposto sobre aplicação financeira -------------------------------------------------- -- Simulação do investimento: http://www.sofisadireto.com.br/rentabilidade/ -- Tabela de impostos: http://normas.receita.fazenda.gov.br/sijut2consulta/link.action?visao=anotado&idAto=67494 /* Tabela de imposto de renda sobre aplicações financeiras 22,5% = inferior a 6 meses 20,0% = entre 6 e 12 meses 17,5% = entre 12 e 24 meses 15,5% = maior que 24 meses */ -- Teste select 1252.05 * 0.175 as [1252.05 * 0.175 - Sem Arredondamentos], round(1252.05 * 0.175, 2) as [1252.05 * 0.175 - Round], -- cálculo não bate na última casa round(1252.05 * 0.175, 2, 1) as [1252.05 * 0.175 - Trunc] -- cálculo bate -------------------------------------------------- -- Truncate manual -------------------------------------------------- -- Formula: inteiro(Numero * (10^2)) / 10^2 -- SQL: cast(cast(<numero>*(power(10.00, <casas_decimais>)) as int)/power(10.00, <casas_decimais>) as numeric(21,2)) select round(1.999, 2) as arredondado, round(1.999, 2, 1) as truncado_sql, cast(cast(1.999*(power(10.00, 2)) as int) / power(10.00, 2) as numeric(21,2)) as truncado_manual
CONCLUSÃO
Como você viu, é muito simples TRUNCAR e ARREDONDAR no SQL. Só não sei porque tive de fazer um artigo desse tamanho para explicar duas coisas tão banais… kkkkkk
Acho que é minha ânsia por mostrar na prática as coisas, espero que nesse quesito tenha acertado.
Abraço do seu amigo Josué 🙂