Por que eu devo ler este artigo:Criar sistemas que manipulam valores monetários na plataforma Java sempre foi motivo de dor de cabeça para os desenvolvedores.

Quem já precisou criar uma aplicação de e-commerce, por exemplo, já notou que as técnicas disponíveis no momento sempre nos levam a problemas difíceis de serem superados ou a um grande trabalho manual de codificação de classes próprias que visam manipular esses valores de forma satisfatória.

É neste cenário que surge a Money API, solução que visa facilitar enormemente esta tarefa, trazendo uma API simples e intuitiva de ser usada.

Embora seu lançamento esteja previsto apenas na nona versão do Java, desde já podemos usá-la e nos antecipar a estas mudanças, pois a JSR e sua implementação de referência já estão disponíveis.

Após ler este artigo e entender como esta API vai facilitar substancialmente sua vida, não temos dúvidas que você irá baixá-la agora mesmo e começar a utilizá-la em seu próximo projeto!

Você já precisou criar uma aplicação na qual existe a necessidade de manipulação de valores monetários? Dois bons exemplos de aplicações deste tipo são os e-commerce e sistemas de frente de loja, nos quais precisamos constantemente somar, subtrair, dividir e multiplicar valores em dinheiro, sem contar a necessidade de converter valores de real para outra moeda. Para dificultar um pouco mais, precisamos também imprimir esses valores de forma amigável para o usuário.

Caso ainda não o tenha feito, pergunte para quem já precisou desenvolver estes tipos de sistemas e a resposta provavelmente será que o Java deveria fornecer uma forma mais simples e elegante de tratar valores monetários.

Embora aparente ser um problema simples, existem diversos aspectos com os quais devemos nos preocupar e que nos sobrecarregam.

Atualmente, a prática mais comum entre os desenvolvedores consiste em criar um campo do tipo Double, Float ou BigDecimal para armazenar estes valores.

Contudo, como veremos no decorrer deste artigo, estas não são práticas recomendáveis, assim como também não é aconselhável utilizar os tipos int e long para esta tarefa.

Contudo, todos estes problemas estão prestes a desaparecer com o lançamento da Money API, que virá junto com a nona versão do Java, com lançamento previsto para o ano de 2016.

A Money API é representada pela JSR 354 e vem para simplificar esta árdua tarefa. Deste modo, dedicaremos todo este artigo para analisar as motivações que levaram à criação desta nova JSR, assim como a instalação da Moneta (implementação de referência desta JSR) e diversos exemplos de código demonstrando como usar esta nova API desde já, sem a necessidade de aguardar o lançamento do Java 9.

A vida antes da Money API

Antes de começarmos a analisar esta nova API, vamos relembrar como manipulamos valores monetários nas atuais versões do Java. Para isso, suponha que estamos projetando uma aplicação de frente de loja, e por ser comum a soluções desse tipo, precisaremos de uma classe chamada Produto que, além de outros atributos, necessita de um campo para armazenar o preço.

Ao codificar esse atributo, logo pensamos em especificá-lo como sendo do tipo Double ou Float.

Mas, será esta uma boa prática? Em seu livro Money API (ver seção Links), Otávio Santana, um dos responsáveis por essa JSR, nos mostra que esta não é uma prática recomendável quando precisamos de valores precisos.

Este argumento também é sustentado por Joshua Bosch, em seu livro Effective Java: os tipos Double e Float foram criados para cálculos científicos e de engenharia. Quando os usamos para representar moeda, surgem alguns problemas difíceis de serem superados.

Por exemplo, suponha que o seu produto custe R$ 1,03, mas você resolveu dar um desconto de R$ 0,42 para um cliente. Qual valor você espera que esse atributo tenha após realizada esta subtração?

Exatos 0.61, correto? Mas, caso você resolva imprimir este atributo no console, verá que o valor impresso será 0.6100000000000001, conforme demonstra o código da Listagem 1. Trata-se de uma aproximação e não o valor exato que queríamos.

Listagem 1. Primeiro problema ao usar Double ou Float para valores monetários.


  package br.com.devmedia;
 
 public class DoubleFloat {
 
     public static void main(String...args) {
                 System.out.println(1.03 - 0.42); // Imprime 0.6100000000000001
     }
 
 }

Você pode argumentar que basta arredondar este valor e estará tudo resolvido! Mas, isto nem sempre irá funcionar, conforme o código da Listagem 2 nos mostra.

Observe nesta listagem que usamos apenas valores simples, com apenas uma casa decimal, para fazer os cálculos, e mesmo assim o Java imprime no console o valor 0.39999999999999997, que obviamente não era o que esperávamos. O correto seria termos impresso o valor 0.40.

Ainda assim, você pode arredondar este ...

Quer ler esse conteúdo completo? Tenha acesso completo