Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

O valor não fica zerado

Pessoal fiz aqui o meus métodos e tudo funciona blz mas se vou fazendo saques até que o saldo fique zerado vejo isso aqui 2.8421709430404007E-14


public class Conta {
    private double saldo;
    private int agencia;
    private int numero;
    private Cliente titular;
    private static int total = 0;
    public boolean saca(double valor) {
        if(this.saldo >= valor) {
            this.saldo -= valor;
            return true;
        } else {
            return false;
        }
    }
}
public class ContaCorrente extends Conta{
    public ContaCorrente(int agencia, int numero){
        super( agencia,  numero);
    }
    @Override
    public boolean saca(double valor){

           return super.saca(valor+0.2);


    }
}
1 resposta
solução!

Tanto double quanto float carregam erros de arredondamento, e embora sejam utilizado a título de simplicidade nos exemplos dos cursos, são contra-recomendados na hora de mexer com dinheiro no mundo real. A solução mais simples para estudo talvez seja usar int considerando sempre os dois últimos digitos como centavos, e na hora que for fazer o output, dividir por 100 o saldo.

O mais utilizado em situações reais que envolvam valores que precisam ser exatos é a biblioteca BigDecimal. Pra usar essa biblioteca, primeiro você precisa importar no início do seu código:

import java.math.BigDecimal;

O problema do BigDecimal é que ele é um pouco mais complicado de usar do que uma variável de tipo primitivo (float, int, char, etc). Você vai instanciar um objeto do tipo BigDecimal, e vai executar operações matemáticas chamando métodos próprios desse objeto que já fazem a tratativa necessária para garantir a precisão do númeor. Por exemplo, ao invés de fazer:

BigDecimal umNumero = 1;
BigDecimal segundoNumero = 2;
BigDecimal terceiroNumero = umNumero + segundoNumero;

você precisaria instanciar e chamar o método do objeto para somar, dessa forma:

BigDecimal umNumero = new BigDecimal("1.0");
BigDecimal segundoNumero = new BigDecimal("2.0");
BigDecimal terceiroNumero = umNumero.add(segundoNumero);

Enfim, para fins de estudo às vezes é mais fácil usar double e ignorar o erro de precisão ou usar int/long. Existe uma explicação matemática para esse erro de arredondamento de float e double, mas sinceramente nunca tive paciência para ler, é algo de lógica que é estudado em cursos de ciência da computação e etc.