Multiplicação de valores com resultado curioso

Aew galera estou tendo um problema

Quando faço a multiplicação de um valor tanto com BigDecimal quanto Double e retorna uma dizima que nao existe por exemplo

[code]public class TesteCalculo {

private static BigDecimal d1;

public static void main(String[] args) {

d1 = new BigDecimal(29.9);

d1 = d1.multiply(new BigDecimal(3));

System.out.println(d1);

}

}[/code]

Retorno

89.69999999999999573674358543939888477325439453125

E se eu nao arredondo pra cima da problema pois perco 1 centavo por que isso acontece nao deveria retornar 89.70?

Não é a multiplicação que tem resultado curioso. É que você não deve usar o construtor de BigDecimal que recebe um double. Experimente modificar seu programa para:

 public class TesteCalculo {  
   
     private static BigDecimal d1;  
   
     public static void main(String[] args) {  
   
     d1 = new BigDecimal(29.9);  
   
   
     System.out.println(d1);  
   
     }  
   
 } 

Para corrigir seu programa, faça:

public class TesteCalculo {  
   
     private static BigDecimal d1;  
   
     public static void main(String[] args) {  
   
     d1 = new BigDecimal("29.9");  
   
     d1 = d1.multiply(new BigDecimal(3));  
   
     System.out.println(d1);  
   
     }  
   
 }  

E para nunca mais repetir esse erro em outros contextos, pesquise no Google como ocorre perda de precisão com uso de tipos de ponto flutuante no Java.