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é 🙂

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *