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.