Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

3
respostas

Por que o valor aparece zerado??

package calculadorajuroscompostos;

import java.util.Scanner;

public class CalculadoraJurosCompostos {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        String retornar;
        do{
            System.out.println("------------------------------------CALCULADORA DE JUROPS COMPOSTOS------------------------------------");
            System.out.print("\nDigite o valor do Capital:     ");
            double capital = teclado.nextDouble();
            System.out.print("\nDigite o percentual da Taxa de Juros:     ");
            float taxa = teclado.nextFloat();
            System.out.print("\nDigite o Período de Tempo:     ");
            int periodoDeTempo = teclado.nextInt();
            Formula formula = new Formula(capital, taxa, periodoDeTempo);
            System.out.println("----------RESULTADO---------");
            System.out.printf("\nTOTAL DO MONTANTE É DE:     R$ %.2f", formula.resultadoDaFormula());
            System.out.print("\n\nDeseja retornar ai início?? S/N:     ");
            retornar = teclado.next();
        }while(retornar.equals("S") || retornar.equals("s"));
    }
}

package calculadorajuroscompostos;

public class DadosFormula {
    protected final double capital;
    protected final float taxaDeJuros;
    protected final int periodo;
    protected double montante;
    public DadosFormula(double capital, float taxaDeJuros, int periodo) {
        this.capital = capital;
        this.taxaDeJuros = taxaDeJuros;
        this.periodo = periodo;
    }
    public double getCapital() {
        return capital;
    }
    public float getTaxaDeJuros() {
        return taxaDeJuros;
    }
    public int getPeriodo() {
        return periodo;
    }
    public double getMontante() {
        return montante;
    }
    public void setMontante(double montante) {
        this.montante = montante;
    }
}

package calculadorajuroscompostos;

public class Formula extends DadosFormula{
    public Formula(double capital, float taxaDeJuros, int periodo) {
        super(capital, taxaDeJuros, periodo);
    }
    public double formula2(){
        double calculo = getCapital() * (Math.pow(((1 + getTaxaDeJuros()) / 100), (int)getPeriodo()));
        return calculo;
    }
    public void formula(){
        setMontante(this.formula2());
    }
    public double resultadoDaFormula(){
        return getMontante();
    }
}

Por que será que esse programa em java não calcula corretamente?? Alguém poderia me ajudar?? São três classes, a primeira de cima é a principal, a segunda é a classe Mãe e a terceira e última é a classe filha!

3 respostas

Olá, Wagner, como vai?

O valor aparece zerado porque o atributo montante nunca recebe o resultado do cálculo antes de ser retornado. Na classe Formula, o método resultadoDaFormula() apenas retorna getMontante(), mas o método formula(), responsável por executar setMontante(this.formula2()), não é chamado em nenhum momento. Como montante é um atributo do tipo double, ele é inicializado com o valor padrão 0.0, e esse é o valor exibido pelo programa.

Há também um detalhe na fórmula dos juros compostos. Atualmente você utiliza Math.pow(((1 + getTaxaDeJuros()) / 100), getPeriodo()). Se a taxa for informada como 10, por exemplo, o fator correto é 1 + (10 / 100.0), ou seja, 1.1. Na implementação atual, o cálculo utiliza (1 + 10) / 100, resultando em 0.11, o que altera completamente o resultado esperado.

Uma alternativa é chamar formula() antes de imprimir o montante ou fazer com que resultadoDaFormula() invoque esse método antes de retornar o valor calculado.

Parabéns por organizar o projeto em diferentes classes para separar as responsabilidades. Continue compartilhando suas dúvidas, pois o fórum está à disposição para ajudar no seu aprendizado.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Olá, tudo bem? Eu fiz uma pequena mudança mas mesmo assim aparece com saldo zerado! De que forma teria que ser? Poderia me ajudar?

package calculadorajuroscompostos;
import java.util.Scanner;
public class CalculadoraJurosCompostos {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        Dados formula = new Formula();
        String retornar;
        do{
            System.out.println("------------------------------------CALCULADORA DE JUROS COMPOSTOS------------------------------------");
            System.out.print("\nDigite o valor do Capital:     ");
            double capital = teclado.nextDouble();
            ((Formula)formula).setCapital(capital);
            System.out.print("\nDigite o percentual da Taxa de Juros:     ");
            float taxa = teclado.nextFloat();
            ((Formula)formula).setTaxaDeJuros(taxa);
            System.out.print("\nDigite o Período de Tempo:     ");
            int periodoDeTempo = teclado.nextInt();
            ((Formula)formula).setPeriodo(periodoDeTempo);
            System.out.println("\n----------RESULTADO---------");
            System.out.printf("\nTOTAL DO MONTANTE É DE:     R$ %.2f", ((Formula)formula).resultadoFormula());
            System.out.print("\n\nDeseja retornar ai início?? S/N:     ");
            retornar = teclado.next();
        }while(retornar.equals("S") || retornar.equals("s"));
    }
}

package calculadorajuroscompostos;
public class Dados{
    protected double capital;
    protected float taxaDeJuros;
    protected int periodo;
    protected double montante;
    public double getCapital() {
        return capital;
    }
    public void setCapital(double capital) {
        this.capital = capital;
    }
    public float getTaxaDeJuros() {
        return taxaDeJuros;
    }
    public void setTaxaDeJuros(float taxaDeJuros) {
        this.taxaDeJuros = taxaDeJuros;
    }
    public int getPeriodo() {
        return periodo;
    }
    public void setPeriodo(int periodo) {
        this.periodo = periodo;
    }
    public double getMontante() {
        return montante;
    }
    public void setMontante(double montante) {
        this.montante = montante;
    }
}

package calculadorajuroscompostos;
public class Formula extends Dados{
    private double calculo;
    public void calculoFormula(){
        this.calculo = super.getCapital() * (Math.pow((1 + (super.getTaxaDeJuros() / 100)), (int)super.getPeriodo()));
        super.setMontante(calculo);
    }
    public double resultadoFormula(){
        return super.getMontante();
    }
}

Olá, Wagner, como vai?

O comportamento continua acontecendo porque, embora a fórmula tenha sido corrigida, o método calculoFormula() ainda não está sendo executado. Atualmente, resultadoFormula() apenas retorna o valor armazenado em montante, mas esse atributo permanece com o valor padrão 0.0 até que setMontante(calculo) seja chamado dentro de calculoFormula().

Uma forma de corrigir isso é fazer com que resultadoFormula() execute o cálculo antes de retornar o valor:

public double resultadoFormula() {
    calculoFormula();
    return getMontante();
}

Dessa forma, sempre que você solicitar o resultado, o montante será atualizado antes de ser exibido.