Para você entender melhor.
Você já viu uma calculadora daquelas que imprime em papel, que você vê normalmente na fila do caixa do restaurante onde você faz suas refeições?
Ela normalmente tem dois jeitos de operar: ou ela sempre trabalha com centavos (por exemplo, 3.00 + 2.45 = 5.45), ou então ela escreve todas as casas depois da vírgula que couberem no visor (por exemplo, 1 dividido por 3 = 0.333333333, 100 dividido por 3 = 33.33333333).
No primeiro modo, o ponto é fixo; no segundo modo, o ponto é flutuante (ou seja, ele muda de lugar conforme o cálculo que se faz).
Java usa as variáveis do tipo double (prefira usar) ou float (desaconselhável usar) como se fosse essa calculadora em que o ponto muda de lugar conforme a conta.
Para trabalhar como se fosse a calculadora de “ponto fixo” dá mais trabalho (você tem de usar “BigDecimal”) e é mais lento.
A rigor, o Java trabalha como se fosse uma daquelas calculadoras científicas (onde uma conta muito grande, em vez de estourar, é mostrado com a notação cientîfica, como 2.344444E+12).
Só que ele não faz as contas em decimal (com os dígitos de 0 a 9) e sim em binário, como todo computador que se preza; então você pode ter algumas surpresas na hora de fazer as contas, do tipo 1.0 - 3.0 * (1.0 / 3.0) dar um resultado esquisito, em vez de 0.