Campos para Valores (Dinheiro)

estou criando uma classe onde preciso ter um campo para ser armazenado um determinado valor tipo 9,857,356.56

qual seria o melhor tipo de campo ??
Float, Double, BigDecimal???

[quote=cpmmarcelo]estou criando uma classe onde preciso ter um campo para ser armazenado um determinado valor tipo 9,857,356.56

qual seria o melhor tipo de campo ??
Float, Double, BigDecimal???
[/quote]

A resposta à sua questão é mais complicada do que vc possa pensar.
Se a sua pergunta é: “qual classe padrão do java devo utilizar” eu diria que BigDecimal ou Long (o pq de Long vc vai entender depois). No cado de Long
poderia ser subtituido pelo tipo primitivo long.

Se a sua pergunta é “qual é a melhor forma de representar dinheiro em java” a resposta é “crie uma classe que encapsule as regras de calculo da(s) moeda(s) que esteja usado”. Neste caso vc cria uma classe com um parametro long (e um parametro Currency , se a sua classe permite trabalhar com várias moedas). Um exemplo para Real
(a implementação é meio de cabeça , por isso pode ter algum erro)


class Dinheiro {
   private long quantidade;
 
   private Dinheiro (){}

   public Dinheiro (String valor){
           this(new BigDecimal(valor));
    }

    public Dinheiro (BigDecimal  valor){
           quantidade = (int)(valor.doubleValue() * 100) ;
    }


   public BigDecimal getQuantidade() {
               return BigDecimal (quantidade / 100);
   }


   public Dinheiro soma (Dinheiro outro ){
           Dinheiro d = new Dinheiro ();
           d.quantidade = this.quantidade + outro.quantidade;
           retorna d;
   }

   public Dinheiro multiplica ( int fator){
           Dinheiro d = new Dinheiro ();
           d.quantidade = this.quantidade * fator;
           return d;
   }

 // outros métodos como equals ()  e compareTo()
}

Existem muitas vantagem em usar a segunda abordagem, mas a implementação de uma classe dinheiro não é trivial se ela poder usar qq moeda.

Uma abordagem intermédia é usar um campo Long internamente noutra classe , por exemplo:


class Item {

 Produto p;
 long price;
 
  public double getPrice(){
        return price / 100;   // poderia usar BigDecimal
  }

}

Esta implementação acaba dando mais trabalho já que poderia usar BigDecimal diretamente.

Resumindo:
Quer usar uma classe padrão e não ter problemas: use BigDecimal
Quer ter menos problemas ainda ? Crie uma classe Dinheiro

Pattern Money, definido pelo Martin Fowler:
http://www.martinfowler.com/eaaCatalog/money.html