SaldoMais
Carregando…
Documento 04 de 07

Calculadoras Financeiras

Fórmulas matemáticas, parâmetros de entrada, estrutura de retorno, edge cases tratados e o padrão de separação entre lógica pura e UI nas 8 calculadoras.

Padrão de arquitetura

Cada calculadora é implementada em dois níveis:

  • Função pura (calcXxx) — recebe apenas números, sem acesso ao DOM. Determinística e testável isoladamente.
  • Função de UI (calcularXxx) — lê os inputs do DOM via parseBRCalc(), valida os dados, chama a função pura e injeta o HTML de resultado.

Esse padrão permite testar as fórmulas sem depender do browser e facilita reutilizar a lógica matemática em outros contextos.

Parser de entrada

parseBRCalc(str: string): number
// Aceita formato brasileiro ("1.000,50") ou americano ("1000.50").
// Detecta o separador decimal com base na posição relativa de "." e ",".

1. Juros Compostos

Função: calcJurosCompostos(capital, aporte, taxaAnual, periodo)

Simula a evolução de um investimento com capital inicial, aportes mensais opcionais e taxa anual.

Fórmula

i_mensal = (1 + taxaAnual)^(1/12) - 1

// A cada mês m:
saldo_m = saldo_(m-1) * (1 + i) + aporte

Parâmetros

ParâmetroTipoUnidade
capitalnumberR$
aportenumberR$ (0 se não houver)
taxaAnualnumberdecimal (ex: 0.12 para 12%)
periodonumbermeses

Retorno

{
  saldo: number,
  totalInvestido: number,
  totalJuros: number,
  linhas: Array<{ mes: number, aporte: number, jurosMes: number, montante: number }>
}

2. Simulador CDB / CDI

Função: calcCDBCDI(valor, taxaCDI, percentual, prazo)

Calcula o rendimento líquido de um CDB pós-fixado indexado ao CDI.

Fórmula

taxaEfetiva_aa = taxaCDI * (percentual / 100) / 100
taxaDiaria     = (1 + taxaEfetiva_aa)^(1/252) - 1
rendBruto      = valor * ((1 + taxaDiaria)^prazo - 1)

ir       = rendBruto * aliquota
valorLiq = valor + rendBruto - ir

IR regressivo (renda fixa)

Prazo (dias corridos)Alíquota
≤ 18022,5%
181 – 36020,0%
361 – 72017,5%
> 72015,0%

Retorno

{ rendBruto: number, ir: number, valorLiq: number, aliquota: number }

3. Aporte para Meta

Função: calcAporteMeta(meta, prazo, taxaMensal)

Calcula o valor de aporte mensal necessário para atingir um objetivo financeiro no prazo definido.

Fórmula — PMT de anuidade ordinária

PMT = meta * i / ((1 + i)^n - 1)

Onde i é a taxa mensal e n é o número de meses.

Retorno

{ pmt: number, totalAportado: number, totalJuros: number }

4. Renda de Dividendos

Função: calcDividendYield(patrimonio, yieldAnual)

Estima a renda passiva gerada por um patrimônio com base no dividend yield anual declarado.

Fórmula

rendaAnual  = patrimonio * (yieldAnual / 100)
rendaMensal = rendaAnual / 12
Cálculo simples sem considerar reinvestimento ou variação do patrimônio.

Retorno

{ rendaAnual: number, rendaMensal: number }

5. Financiamento (Tabela Price)

Função: calcFinanciamentoPrice(pv, taxaMensal, n)

Calcula parcelas constantes de um financiamento pelo método Price (amortização francesa).

Fórmula

parcela = PV * i / (1 - (1 + i)^-n)

// Tabela de amortização (por parcela k):
juros_k = saldo_(k-1) * i
amort_k = parcela - juros_k
saldo_k = max(0, saldo_(k-1) - amort_k)

Retorno

{
  parcela: number,
  totalPago: number,
  totalJuros: number,
  linhas: Array<{ parcela: number, prestacao: number, amort: number, juros: number, saldo: number }>
}

6. Rotativo do Cartão de Crédito

Função: calcRotativoCartao(divida, taxaMensal, pagamento)

Simula a evolução de uma dívida no rotativo com pagamento fixo mensal.

Fórmula

// A cada mês:
juros     = saldo * taxaMensal
pag       = min(pagamento, saldo + juros)
novoSaldo = max(0, saldo + juros - pag)

Edge cases

Pagamento impossível: Se pagamento <= juros do primeiro mês, a dívida nunca será quitada. A função retorna { impossivel: true, jurosPrimeiro } sem simular.
  • Máximo de 1200 iterações (100 anos). Se atingido, maxAtingido: true.
  • A tabela de resultado contém apenas os primeiros 24 meses.

Retorno

// Caso impossível:
{ impossivel: true, jurosPrimeiro: number }

// Caso normal:
{
  meses: number, totalPago: number, totalJuros: number, maxAtingido: boolean,
  linhas: Array<{ mes: number, saldo: number, juros: number, pag: number, novoSaldo: number }>
}

7. À Vista vs Parcelado

Função: calcAVistaVsParcelado(avista, parcelaValor, nParcelas, taxaMensal)

Compara o custo real de pagar à vista versus parcelado, considerando o custo de oportunidade do capital.

Fórmula — Valor presente das parcelas

PV_parcelas = parcelaValor * (1 - (1 + i)^-n) / i

Se PV_parcelas < avista: parcelado é mais vantajoso (o capital rende mais do que o custo implícito das parcelas).

Retorno

{
  pvParcelas: number,
  totalParcelado: number,
  parceladoMelhor: boolean,
  diferenca: number
}

8. Vale a Pena Quitar a Dívida?

Função: calcQuitarDivida(saldo, taxaDivida, parcelas, desconto, disponivel, taxaInvest)

Compara quitar a dívida antecipadamente (com desconto) vs. manter o dinheiro investido pelo mesmo período.

Fórmula

saldoDesconto  = saldo * (1 - desconto / 100)
pmtOriginal    = saldo * taxaDivida / (1 - (1+taxaDivida)^-parcelas)
totalOriginal  = pmtOriginal * parcelas
rendPerdido    = disponivel * ((1 + taxaInvest)^parcelas - 1)

// Cenário A — Quitação total (disponivel >= saldoDesconto):
economia = totalOriginal - saldoDesconto

// Cenário B — Quitação parcial (disponivel < saldoDesconto):
novoSaldo  = saldoDesconto - disponivel
pmtNovo    = novoSaldo * taxaDivida / (1 - (1+taxaDivida)^-parcelas)
economia   = totalOriginal - (disponivel + pmtNovo * parcelas)

A recomendação é quitarMelhor = economia > rendPerdido.

Retorno

{
  saldoDesconto: number,
  economia: number,
  rendimentoPerdido: number,
  cenario: 'A' | 'B',
  infoCenario: string,
  diferenca: number,
  quitarMelhor: boolean
}