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:


José Carlos Macoratti