VB .NET - Cálculos financeiros : Juros e Desconto
A linguagem VB .NET fornece uma maneira muito simples de realizar cálculos usando funções matemáticas e neste artigo irei apresentar algumas dessas funções e criar um exemplo simples realizando cálculos na linguagem VB .NET.
A seguir temos as operações básicas realizadas pelo VB .NET :
Operações matemáticas básicas
|> Adição
(+)
|> Subtração (-)
|> Multiplicação (*)
|> Divisão (/)
|> Exponenciação (^)
|> Divisão Inteira (\)
|> Resto da divisão (Mod)
Só isso !!!!
É claro que não...
Para outras operações você pode usar os métodos disponíveis na classe System.Math.
A seguir temos alguns membros da classe System.Math :
|> Funções
Trigonométricas (Sin, Cos, Tan, etc)
|> Funções Logarítmicas (Log e Log10)
|> Constantes (PI e E)
|> Funções para Potenciação (Exp, Pow, e Sqrt)
|> Funções para Arredondamento (Floor, Ceiling)
|> Funções Comparativas (Max, Min)
|> Funções Relacionados com sinais (Abs)
Vejamos a seguir alguns
exemplo de utilização de funções matemáticas:(Observe que em alguns casos não
precisamos definir a classe Math)
Função | Uso |
---|---|
Math.Abs() | Retorna o valor
absoluto. Math.Abs(-10) retorna 10. |
Math.Ceiling() | Retorna o menor
inteiro maior que é maior ou igual ao número
especificado: Math.Ceiling(5.333) retorna 6. |
Fix() | Retorna a porção
inteira de um número. Fix(5.3333) retorna 5. |
Math.Floor() | Retorna o maior
inteiro que é menor que ou igual ao número
especificado: Fix(5.3333) retorna 5. Para números negativos o comportamento pode ser diferente: Math.Floor(4.8) retorna 4. Math.Floor(-4.8) retorna -5. |
Int() | Retorna a porção
inteira de um número: Int(5.3333) retorna 5. |
Math.Max() | Retorna o maior
entre dois números: Math.Max(5,7) retorna 7. |
Math.Min() | Retorna o menor
dentre dois números: Math.Min(5,7) retorna 5. |
Math.Pow() | Retorna um número
elevado a potência indicada: Math.Pow(12,2) - (doze ao quadrado) retorna 144. |
Rnd() | Retorna a número aleatório entre 0 e 1. Usado em conjunto com a instrução Randomize para iniciar o gerador de números aleatórios: |
Math.Round() | Arredonda um
número para um número específico de casas decimais.
Arredonda com 5 casas decimais. Math.Round(1.1234567,5) retorna 1.12346. Math.Round(5.44, 1) - retorna 5.4 Math.Round(5.45, 1) - retorna 5.4 Math.Round(5.46, 1) - retorna 5.5 Math.Round(5.54, 1) - retorna 5.5 Math.Round(5.55, 1) - retorna 5.6 Math.Round(5.56, 1) - retorna 5.6 Se o número a ser arredondado estiver exatamente entre a metade de dois números como 5.5 ou 6.5 ou 7.5 o arredondamento ocorrerá retornando o número par mais próximo ao número: Math.Round(5.5) ' retorna 6 Math.Round(8.5) ' retorna 8 |
Math.Sign() | Retorna o sinal de
um número. Retorna -1 se negativo e 1 se positivo. Math.Sign(-5) retorna -1. |
Math.Sqrt() | Retorna a raiz
quadrada de um número positivo: Math.Sqrt(144) retorna 12. |
Math.Pi | Representa
a constante PI A = Math.PI * Math.Pow(raio, 2) - retorna a área do círculo para o raio informado (A= PI . R ^2) Obs: O símbolo ^ significa "elevado a" |
Aplicação Prática - Juros Compostos
No regime de juros compostos os
juros obtidos a cada período são incorporados ao capital
para o cálculo dos juros do período seguinte.
A capitalização é o momento no qual os juros são incorporados
ao principal.
Exemplo : Após quatro
meses de capitalização, temos:
1º
mês: M = C .(1 + i)
2º mês: o capital é igual ao montante do mês anterior: M = C
x (1 + i) x (1 + i)
3º mês: o capital é igual ao montante do mês anterior: M = C
x (1 + i) x (1 + i) x (1 + i)
4º mês: o capital é igual ao montante do mês anterior: M = C
x (1 + i) x (1 + i) x (1 + i) x (1 + i)
Dessa forma obtemos a seguinte fórmula: M = C . (1
+ i)^n
Onde a taxa de juros i deve ser expressa na mesma medida de
tempo de n, isto é, se o tempo for expresso em meses
a taxa de juros usada deve ser mensal.
A fórmula acima expressa na linguagem VB .NET poderia ser escrita da seguinte forma:
Dim M as Double Dim C As Double Dim i As Double Dim n as Double M
= C * Math.Pow((1 + i ), n
) |
Para calcular só os juros basta subtrair o capital do montante
no final de um período: J = M - C
Além destas funções o VB .NET
disponibiliza algumas funções financeiras para cálculos mais
precisos e específicos. Veja abaixo as principais:
Funções Financeiras presentes no namespace Microsoft.VisualBasic.Financial
Ação | Função |
---|---|
Calcular depreciação | DDB, SLN, SYD |
Calcular valor futuro | FV |
Calcular taxa de juros. | Rate |
Calcular taxa interna de um retorno | IRR, MIRR |
Calcular número de períodos | NPer |
Calcular pagamentos | IPmt, Pmt, PPmt |
Calcular valor presente. | NPV, PV |
Vamos agora a parte prática...
Vamos criar um projeto Windows Forms que permite calcular o Montante, o Capital e o Tempo usando a fórmula dos juros Compostos.
Para isso eu vou usar o Visual Basic 2008 Express Edition e no menu File -> New Project selecionar o template Windows Forms Application informando o nome JurosCompostos.
No formulário padrão form1.vb vamos definir um leiaute bem simples conforme o da figura abaixo:
No formulário o usuário deverá selecionar o que deseja calcular : Montante, Capital ou Tempo.
Em seguida deverá informar os valores solicitados conforme a sua opção, e, para calcular clicar no botão Calcular.
Para realizar os cálculos vou criar uma classe chamada Calcular. Para isso selecione o menu Project -> Add Class;
A seguir informe o nome Calcular.vb e clique no botão Add;
O código da classe esta exibido abaixo:
Public Class Calcular Private _montante As Double Private _capital As Double Private _taxa As Double Private _tempo As Double Sub New() End Sub Public Property Montante() As Double Get Return _montante End Get Set(ByVal value As Double) _montante = value End Set End Property Public Property Capital() As Double Get Return _capital End Get Set(ByVal value As Double) _capital = value End Set End Property Public Property Taxa() As Double Get Return _taxa End Get Set(ByVal value As Double) _taxa = value End Set End Property Public Property Tempo() As Double Get Return _tempo End Get Set(ByVal value As Double) _tempo = value End Set End Property Public Shared Function CalculaMontante(ByVal calc As Calcular) As Double Dim valor As Double Try valor = calc.Capital * Math.Pow((1 + calc.Taxa), calc.Tempo) Catch ex As Exception Throw End Try Return valor End Function Public Shared Function CalculaCapital(ByVal calc As Calcular) As Double Dim valor As Double Try valor = calc.Montante / Math.Pow((1 + calc.Taxa), calc.Tempo) Catch ex As Exception Throw End Try Return valor End Function Public Shared Function CalculaTempo(ByVal calc As Calcular) As Double Dim valor As Double Try valor = (Math.Log10(calc.Montante) - Math.Log10(calc.Capital)) / Math.Log10(1 + calc.Taxa) Catch ex As Exception Throw End Try Return valor End Function End Class |
A classe Calcular possui os seguintes membros:
Propriedades
Métodos:
Nota: Os métodos foram definidos como shared de forma que não precisamos criar uma instância da classe para acessá-los.
No formulário form1.vb temos o seguinte código :
Public Class Form1 Dim resultado As Double Dim juros As Double Dim calculos As Calcular Private Sub rdbMontante_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdbMontante.CheckedChanged grade1() End Sub Private Sub rdbCapital_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdbCapital.CheckedChanged Me.Width = 302 grade2() End Sub Private Sub rdbTempo_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdbTempo.CheckedChanged Me.Width = 302 grade4() End Sub Private Sub grade1() Label1.Text = "Capital" Label2.Text = "Tempo" Label3.Text = "Taxa de Juros" End Sub Private Sub grade2() Label1.Text = "Montante" Label2.Text = "Tempo" Label3.Text = "Taxa de Juros" End Sub Private Sub grade4() Label1.Text = "Montante" Label2.Text = "Capital" Label3.Text = "Taxa de Juros" End Sub Private Sub btnCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalcular.Click calculos = New Calcular If txtValor1.Text = String.Empty Or txtValor2.Text = String.Empty Or txtValor3.Text = String.Empty Then Return End If If rdbMontante.Checked Then calculos.Capital = Convert.ToDouble(txtValor1.Text) calculos.Tempo = Convert.ToDouble(txtValor2.Text) calculos.Taxa = Convert.ToDouble(txtValor3.Text) / 100 Try resultado = Math.Round(Calcular.CalculaMontante(calculos), 2) juros = resultado - calculos.Capital resultado = String.Format("{0:C}", resultado) juros = String.Format("{0:C}", juros) lblResultado.Text = "Montante = " & resultado.ToString lblJuros.Text = "Juros = " & juros.ToString exibeDetalhes(calculos) Catch ex As Exception MessageBox.Show("Erro : " & ex.Message) End Try ElseIf rdbCapital.Checked Then calculos.Montante = Convert.ToDouble(txtValor1.Text) calculos.Tempo = Convert.ToDouble(txtValor2.Text) calculos.Taxa = Convert.ToDouble(txtValor3.Text) / 100 Try resultado = String.Format("{0:C}", Calcular.CalculaCapital(calculos)) lblResultado.Text = "Capital = " & resultado lblJuros.Text = "" Catch ex As Exception MessageBox.Show("Erro : " & ex.Message) End Try ElseIf rdbTempo.Checked Then calculos.Montante = Convert.ToDouble(txtValor1.Text) calculos.Capital = Convert.ToDouble(txtValor2.Text) calculos.Taxa = Convert.ToDouble(txtValor3.Text) / 100 Try resultado = Math.Round(Calcular.CalculaTempo(calculos), 4) lblResultado.Text = "Tempo = " & resultado.ToString lblJuros.Text = "" Catch ex As Exception MessageBox.Show("Erro : " & ex.Message) End Try End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load cboUnidadeTempo.SelectedIndex = 0 End Sub Private Sub exibeDetalhes(ByVal calc As Calcular) Dim i As Integer Me.Width = 450 listaCalculo.Items.Clear() For i = 0 To calc.Tempo calculos.Tempo = i resultado = Math.Round(Calcular.CalculaMontante(calculos), 2) listaCalculo.Items.Add(i & "-" & String.Format("{0:C}", resultado & vbCrLf)) Next End Sub End Class |
Abaixo temos o resultado da execução calculando :
O programa é simples mas serve para resolver problemas do seguinte tipo:
Se você emprestar ao seu amigo
R$ 5.000,00, a juros compostos, pelo prazo de 5 meses, à taxa de
2% ao mês. Quanto deverá receber de juros ?
Para encerrar eu vou falar um pouco sobre desconto.
Desconto
Racional Composto
Calcular o desconto racional composto sobre um valor
nominal N, obtendo o respectivo valor atual A, é o mesmo que
obter o capital C, de um montante M, a juros compostos. Então,
por analogia
CAPITAL (C) | => VALOR ATUAL (A) |
MONTANTE (M) | => VALOR NOMINAL (N) |
Se para o cálculo do montante
composto dizemos que M = C . (1 + i) ^ n , então, para o cálculo do valor atual
racional compostos, vamos dizer que:
Para entender melhor vamos mostrar um exemplo de problema resolvido :
1) Um título de R$ 1.000,00 é
descontado 3 meses antes do vencimento, à taxa racional composta
de 10% ao mês. Qual o valor atual ?
Resolução:
N = R$
1.000
n = 3
i = 10% = 0,1
Substituindo os dados do problema em A => temos => A = N . (1 + i)^ -n , dai:
A = N .
(1 + i) ^ -n
A = N . (1,1)-3
A = 1.000 . 0,75131
A = R$ 751,31
Tudo certo e como ficaria a tal fórmula no VB .NET ?
A = N * Math.Pow((1 + i), -n )
Vamos então incluir o método CalculaDescontoRacional na classe Calcular conforme o código abaixo:
Public Shared Function CalculaDescontoRacional(ByVal calc As Calcular) As Double Dim valor As Double Try valor = calc.Montante * Math.Pow((1 + calc.Taxa), -calc.Tempo) Catch ex As Exception Throw End Try Return valor End Function |
A seguir vamos alterar a interface incluindo mais um radiobutton (rdbDesconto) conforme o leiaute abaixo:
E finalmente vamos incluir o código abaixo no formulário para tratar as informações recebidas e chamar o método CalculaDescontoRacional da classe:
Obs: O código incluído esta destacado em azul.
Private Sub btnCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalcular.Click calculos = New Calcular If txtValor1.Text = String.Empty Or txtValor2.Text = String.Empty Or txtValor3.Text = String.Empty Then Return End If If rdbMontante.Checked Then calculos.Capital = Convert.ToDouble(txtValor1.Text) calculos.Tempo = Convert.ToDouble(txtValor2.Text) calculos.Taxa = Convert.ToDouble(txtValor3.Text) / 100 Try resultado = Math.Round(Calcular.CalculaMontante(calculos), 2) juros = resultado - calculos.Capital resultado = String.Format("{0:C}", resultado) juros = String.Format("{0:C}", juros) lblResultado.Text = "Montante = " & resultado.ToString lblJuros.Text = "Juros = " & juros.ToString exibeDetalhes(calculos) Catch ex As Exception MessageBox.Show("Erro : " & ex.Message) End Try ElseIf rdbCapital.Checked Then calculos.Montante = Convert.ToDouble(txtValor1.Text) calculos.Tempo = Convert.ToDouble(txtValor2.Text) calculos.Taxa = Convert.ToDouble(txtValor3.Text) / 100 Try resultado = String.Format("{0:C}", Calcular.CalculaCapital(calculos)) lblResultado.Text = "Capital = " & resultado lblJuros.Text = "" Catch ex As Exception MessageBox.Show("Erro : " & ex.Message) End Try ElseIf rdbTempo.Checked Then calculos.Montante = Convert.ToDouble(txtValor1.Text) calculos.Capital = Convert.ToDouble(txtValor2.Text) calculos.Taxa = Convert.ToDouble(txtValor3.Text) / 100 Try resultado = Math.Round(Calcular.CalculaTempo(calculos), 4) lblResultado.Text = "Tempo = " & resultado.ToString lblJuros.Text = "" Catch ex As Exception MessageBox.Show("Erro : " & ex.Message) End Try ElseIf rdbDesconto.Checked Then calculos.Montante = Convert.ToDouble(txtValor1.Text) calculos.Tempo = Convert.ToDouble(txtValor2.Text) calculos.Taxa = Convert.ToDouble(txtValor3.Text) / 100 Try resultado = String.Format("{0:C}", Calcular.CalculaDescontoRacional(calculos)) lblResultado.Text = "Valor Atual = " & resultado lblJuros.Text = "" Catch ex As Exception MessageBox.Show("Erro : " & ex.Message) End Try End If End Sub |
Executando o projeto e fazendo o cálculo para o exemplo mostrado iremos obter:
E era isso que eu tinha para falar sobre como calcular juros e desconto com o VB .NET.
Pegue o projeto completo aqui: JurosCompostos.zip
Eu sei é apenas VB .NET, mas eu gosto...
Referências: