Pergunta

Que tipo de dados é capaz de representar um número decimal como "10.364.055,81".

Se tentou usar double:

double d = 10364055.81;

Mas quando tento imprimir o número, a sua exibição como " 1.036405581E7 ", que eu não quero.

Devo usar BigDecimal? Mas a sua exibição como 10.364.055,81000000052154064178466796875 . Existe algum tipo de dados que exibe os valores como ele é? Além disso, o número pode ser maior do que aquele tomado como exemplo.

BTW, vai usar BigDecimal efeito do desempenho da aplicação ?? Eu poderia usar isso em quase todos os meus DTOs.

Foi útil?

Solução

Você deve usar BigDecimal - mas usar a seqüência de construtor , por exemplo:.

new BigDecimal("10364055.81");

Se você passar um double para BigDecimal, Java deve criar essa dupla primeira - e desde duplos não pode representar a maioria das frações decimais com precisão, ele faz criar o valor como 10364055.81000000052154064178466796875 e então passa para o construtor BigDecimal. Neste caso BigDecimal não tem nenhuma maneira de saber que você realmente significou a versão mais redonda.

De um modo geral, usando construtores não-corda de BigDecimal deve ser considerada um aviso de que você não está recebendo o benefício completo da classe.

Editar - com base na releitura exatamente o que você queria fazer, minha afirmação inicial é provavelmente muito forte. BigDecimal é uma boa opção quando você precisa para representar valores decimais exatamente (manuseio de dinheiro a ser a escolha óbvia, você não quer 5,99 * de um milhão para ser 5990016.45 por exemplo.

Mas se você não está preocupado com o número que está sendo armazenado internamente como um valor ligeiramente diferente ao decimal literal você entrou, e só quero imprimi-lo novamente no mesmo formato, em seguida, como já foi dito, uma instância de NumberFormat (neste caso, new DecimalFormat("########.##")) irá fazer o truque para a saída da dupla bem, ou String.format pode fazer a mesma coisa.

Quanto ao desempenho - BigDecimals será naturalmente mais lento do que usando primitivos. Normalmente, porém, a menos que a grande maioria do seu programa envolve manipulações matemáticas, é improvável que você realmente notar qualquer diferença de velocidade. Isso não quer dizer que você deve usar BigDecimals todo; mas sim, que, se você pode obter um benefício real a partir de suas características que seria difícil ou impossível de realizar com doubles simples, então não suar a diferença de desempenho minúsculo que teoricamente apresentar.

Outras dicas

Como um número é exibido é distinta de como o número é armazenado.

Dê uma olhada DecimalFormat para controlar como você pode exibir os seus números quando um casal (ou flutuar etc.).

Note que a escolha BigDecimal mais do dobro (ou vice-versa) tem vantagens / desvantagens, e vai depender de suas necessidades. Consulte aqui para mais informações. A partir do resumo:

Sumário No, se o desempenho cru e espaço são os fatores mais importantes, primitivas tipos de ponto flutuante são apropriada. Se os valores decimais precisa ser representado exatamente, de alta precisão computação é necessário, ou multa de controle de arredondamento é desejado, unicamente BigDecimal tem o necessário capacidades.

A dupla seria suficiente para salvar esse número. Se o seu problema é que você não faça como o formato ao imprimir ou colocá-lo em um String, que você pode usar NumberFormat: http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html

Você pode usar casal e visor se com System.out.printf ().

double d = 100003.81;
System.out.printf("%.10f", d);

.10f - significa uma dupla com precisão de 10

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top