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 viaparseBRCalc(), 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âmetro | Tipo | Unidade |
|---|---|---|
capital | number | R$ |
aporte | number | R$ (0 se não houver) |
taxaAnual | number | decimal (ex: 0.12 para 12%) |
periodo | number | meses |
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 |
|---|---|
| ≤ 180 | 22,5% |
| 181 – 360 | 20,0% |
| 361 – 720 | 17,5% |
| > 720 | 15,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
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 <= 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
}