Então Lucas, você pode utilizar qualquer um desses tipos de dados. Pra saber qual deles utilizar, vc deve levar em consideração a precisão (quantidade de casas decimais) necessária para tua aplicação. float e double são sempre aproximações utilizando o padrão IEEE 754. O tipo float utiliza 32 bits e consegue representar números de até 7 casas decimais. O double consome 64 bits e representa números de até 15 casas decimais. Já o BigDecimal tem precisão quase infinita, ou seja, teoricamente vc consegue representar números com bilhões de casas decimais. Porém, a aritmética de BigDecimals é bem mais lenta e também não rola utilizar os operadores + - * e /.

// Embora o construtor de BigDecimal também aceite double, 
// isso não é considerado boa prática. Use sempre que possível
// strings.
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");

// Somar a + b
a.add(b);

// Subtrair a - b
a.subtract(b);

Em linhas gerais, se for trabalhar com valores monetários, use BigDecimal. Para quase todo o resto, provavelmente float ou double serão suficientes.