Função TAXA do Excel em Java

Olá, pessoal.

Alguém sabe qual é o algoritmo da função TAXA do Excel? Se souber em Java também agradeço.

Função TAXA
Retorna a taxa de juros por período de uma anuidade. TAXA é calculado por iteração e pode ter zero ou mais soluções. Se os resultados sucessivos de TAXA não convergirem para 0,0000001 depois de 20 iterações, TAXA retornará o valor de erro #NÚM!.

Sintaxe
TAXA(nper;pgto;vp;vf;tipo;estimativa)

Nper é o número total de períodos de pagamento em uma anuidade.
Pgto é o pagamento feito em cada período e não pode mudar durante a vigência da anuidade. Geralmente, pgto inclui o principal e os juros e nenhuma outra taxa ou tributo. Se pgto for omitido, você deverá incluir o argumento vf.
Vp é o valor presente ? o valor total correspondente ao valor atual de uma série de pagamentos futuros.
Vf é o valor futuro, ou o saldo, que você deseja obter depois do último pagamento. Se vf for omitido, será considerado 0 (o valor futuro de um empréstimo, por exemplo, é 0).
Tipo é o número 0 ou 1 e indica as datas de vencimento.
Estimativa é a sua estimativa para a taxa. (Se você omitir estimativa, este argumento será considerado 10%)

Brigaduu!

Para vc receber ajuda, é melhor tentar montar o algoritmo e ir postando suas dúvidas…vc já tem a regra ae, é só começar a fazer…ng vai te entregar pronto!

A questão é que eu não tenho justamente o algoritmo. Se eu tivesse o algoritmo conseguiria desenvolvê-lo em Java.

Bom, vc tem que desenvolver uma função que te retorne numa taxa de juros de um determinado período, então, isso é matemática finaneceira, e retirei essa fórmula da wikipédia:

FV = PV(1 + i)ª

FV: Valor Futuro (do inglês Future Value)
PV: Valor Presente (do inglês Present Value)
i: Taxa de juros (do inglês Interest Rate)
ª: Número de períodos

O cálculo dessa taxa é bem mais complicado que parece, porque envolve resolver uma equação para a taxa, usando um método de aproximações sucessivas.
Procure por “IRR Calculation Java” no Google.
É que o método TAXA do Excel (que é a Taxa Interna de Retorno ou “Internal Return Rate” ) trabalha na verdade com pagamentos de valores desiguais, dados em um intervalo de células. Portanto a fórmula que o Tibúrcio apresentou simplesmente não é suficiente.

Obrigada! Vou pesquisar :slight_smile:

essa classe calcula a taxa de retorno.

/**********************************************************
TAXA DE RETORNO
**********************************************************/
package teste;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import rwk.util.Format;

public class Dia{
  private Date zero;
  private Date data;
  private BigDecimal valor;
  private BigDecimal dias;
  /*=======================================================

  =======================================================*/
  public Date getZero(){return zero;}
  public void setZero(Date zero){this.zero=zero;}
  public Date getData(){return data;}
  public void setData(Date data){this.data=data;}
  public BigDecimal getValor(){return valor;}
  public void setValor(BigDecimal valor){this.valor=valor;}
  public BigDecimal getDias(){return dias;}
  public void setDias(BigDecimal dias){this.dias=dias;}
  /*=======================================================

  =======================================================*/
  public static Dia create(Date zero,Date data,double valor){
    Dia dia=new Dia();

    dia.setData(data);
    dia.setZero(zero);
    dia.setValor(BigDecimal.valueOf(valor));
    dia.setDias(BigDecimal.valueOf(Format.dateDiff(data,zero)));
    return dia;
  }
  /*=======================================================

  =======================================================*/
  public BigDecimal valorPresente(BigDecimal taxa){
    return valor.divide(BigDecimal.ONE.add(taxa).pow(dias.intValue()),10,RoundingMode.FLOOR);
  }
  /*=======================================================

  =======================================================*/
  public Dia inverte(){
    valor=valor.multiply(BigDecimal.valueOf(-1));
    return this;
  }
  /*=======================================================

  =======================================================*/
  public static BigDecimal taxaRetorno(List<Dia>dias){
    Dia ultimo=dias.get(dias.size()-1);
    BigDecimal taxa=BigDecimal.ZERO;
    BigDecimal somatorio;
    BigDecimal passo,limite;

    ultimo.inverte();
    somatorio=BigDecimal.ZERO;
    for(Dia dia:dias)
      somatorio=somatorio.add(dia.valorPresente(taxa));
    passo=BigDecimal.valueOf(somatorio.doubleValue() >=0?-0.000001:+0.000001);
    limite=BigDecimal.valueOf(somatorio.doubleValue()>=0?-1:+1);

    while(true){
      taxa=taxa.add(passo);
      somatorio=BigDecimal.ZERO;
      for(Dia dia:dias)
        somatorio=somatorio.add(dia.valorPresente(taxa));
      if(somatorio.multiply(limite).doubleValue()>0)
        return taxa;//ao dia
    }
  }
  /*=======================================================

  =======================================================*/
  public static BigDecimal taxaAoMes(BigDecimal taxa){
    return taxa.add(BigDecimal.ONE).pow(30).subtract(BigDecimal.ONE);
  }
}