Depende de quais operações você fará. Por favor, ofereça mais informações.
Eversor
@eversor Você pode me dar uma descrição de que tipo de dados deve ser usado para diferentes operações?
questborn
1
Estou fazendo cálculos que exigem que eu represente com precisão centavos.
Questmand
Você é capaz de prever a maior quantia de dinheiro que seu aplicativo precisará gerenciar? E, seus cálculos, eles serão simples (adições etc.) ou operações financeiras mais complexas?
Eversor
Respostas:
133
Java possui uma Currencyclasse que representa os códigos de moeda ISO 4217.
BigDecimalé o melhor tipo para representar valores decimais da moeda.
Joda Money forneceu uma biblioteca para representar dinheiro.
@Borat: você pode, se souber o que está fazendo, consulte este artigo de Peter Lawrey. mas parece pelo menos um aborrecimento tão grande fazer todo o arredondamento quanto usar o BigDecimals.
22915 Nathan Hughes
35
"Se eu tivesse um centavo para cada vez que eu vi alguém uso FLOAT para armazenar moeda, eu tenho R $ 999.997634" - Bill Karwin
Collin Krawll
36
Você pode usar a API Money e Currency (JSR 354) . Você pode usar essa API, desde que adicione dependências apropriadas ao seu projeto.
Para Java 8, inclua a seguinte implementação de referência como uma dependência no seu pom.xml:
Tenha em mente que a quantidade de dinheiro pode transbordar o tamanho do int
Eversor
5
@eversor que precisaria de mais de 20 milhões de dólares a maioria dos aplicativos não precisam que muito se eles fazem uma longa será suficiente como nem mesmo os nossos govenrments lidar com mone suficiente para transbordar que
catraca aberração
4
@ratchetfreak Provavelmente melhor usar um longo tempo então.
Trognanders
5
Muitos bancos lidam com somas muito maiores que US $ 20.000.000 por dia. Isso nem leva em conta moedas como o iene, com grandes taxas de câmbio para o dólar. Os tipos inteiros podem ser melhores para evitar problemas de arredondamento, embora fiquem confusos com os cálculos de juros e taxas de câmbio. No entanto, dependendo do aplicativo, você pode precisar de um tipo inteiro de 64 bits.
Alchymist
Idealmente, os microdólares, na verdade, como se você fizer, por exemplo, US $ 10/3, o erro de arredondamento (3333,3 => 3333,0) não afeta tanto o valor final (neste caso, não afeta o valor real, embora seja perigoso assumir que isso nunca acontecerá). Isso é especialmente importante se você estiver fazendo muitos cálculos seguidos antes que o usuário veja o resultado, pois os erros de arredondamento serão compostos.
Uma API para lidar com, por exemplo, valores monetários e moedas
APIs para suportar implementações intercambiáveis
Fábricas para criar instâncias das classes de implementação
Funcionalidade para cálculos, conversão e formatação de valores monetários
API Java para trabalhar com Money and Currencies, que está planejada para ser incluída no Java 9.
Todas as classes e interfaces de especificação estão localizadas no pacote javax.money. *.
Exemplos de amostra da JSR 354: API Money e Currency:
Um exemplo de criação de um MonetaryAmount e impressão no console se parece com este ::
MonetaryAmountFactory<?> amountFactory =Monetary.getDefaultAmountFactory();MonetaryAmount monetaryAmount = amountFactory.setCurrency(Monetary.getCurrency("EUR")).setNumber(12345.67).create();MonetaryAmountFormat format =MonetaryFormats.getAmountFormat(Locale.getDefault());System.out.println(format.format(monetaryAmount));
Ao usar a API de implementação de referência, o código necessário é muito mais simples:
MonetaryAmount monetaryAmount =Money.of(12345.67,"EUR");MonetaryAmountFormat format =MonetaryFormats.getAmountFormat(Locale.getDefault());System.out.println(format.format(monetaryAmount));
A API também suporta cálculos com MonetaryAmounts:
// getting CurrencyUnits by localeCurrencyUnit yen =MonetaryCurrencies.getCurrency(Locale.JAPAN);CurrencyUnit canadianDollar =MonetaryCurrencies.getCurrency(Locale.CANADA);
MonetaryAmount possui vários métodos que permitem acessar a moeda atribuída, o valor numérico, sua precisão e muito mais:
MonetaryAmount monetaryAmount =Money.of(123.45, euro);CurrencyUnit currency = monetaryAmount.getCurrency();NumberValue numberValue = monetaryAmount.getNumber();int intValue = numberValue.intValue();// 123double doubleValue = numberValue.doubleValue();// 123.45long fractionDenominator = numberValue.getAmountFractionDenominator();// 100long fractionNumerator = numberValue.getAmountFractionNumerator();// 45int precision = numberValue.getPrecision();// 5// NumberValue extends java.lang.Number. // So we assign numberValue to a variable of type NumberNumber number = numberValue;
As MonetaryAmounts podem ser arredondadas usando um operador de arredondamento:
Tudo isso é bom, mas como Federico sugerido acima, parece mais lento do que BigDecimal :-)) piada de mau gosto, em seguida, apenas, mas vou dar-lhe testar agora um ano mais tarde ...
kensai
6
Você deve usar o BigDecimal para representar valores monetários. Permite usar vários modos de arredondamento e, em aplicativos financeiros, o modo de arredondamento costuma ser um requisito difícil que pode até ser exigido por lei.
Interessante, eu vou correr mesmo teste com o mais recente material em JDK9
kensai
4
Para um caso simples (uma moeda) é suficiente Integer/ Long. Mantenha o dinheiro em centavos (...) ou centésimo / milésimo de centavos (qualquer precisão que você precisar com divisor fixo)
BigDecimal é o melhor tipo de dados a ser usado para a moeda.
Existem muitos contêineres para moeda, mas todos usam BigDecimal como o tipo de dados subjacente. Você não irá errar com o BigDecimal, provavelmente usando o BigDecimal.ROUND_HALF_EVEN.
Eu gosto de usar tipos minúsculos que envolvem um double, BigDecimal ou int, como as respostas anteriores sugeriram. (Eu usaria um duplo, a menos que surjam problemas de precisão).
Um tipo minúsculo oferece segurança de digitação, para que você não confunda dinheiro duplo com outras duplas.
Respostas:
Java possui uma
Currency
classe que representa os códigos de moeda ISO 4217.BigDecimal
é o melhor tipo para representar valores decimais da moeda.Joda Money forneceu uma biblioteca para representar dinheiro.
fonte
Você pode usar a API Money e Currency (JSR 354) . Você pode usar essa API, desde que adicione dependências apropriadas ao seu projeto.
Para Java 8, inclua a seguinte implementação de referência como uma dependência no seu
pom.xml
:Essa dependência será adicionada transitivamente
javax.money:money-api
como uma dependência.Você pode usar a API:
fonte
Um tipo integral que representa o menor valor possível. Em outras palavras, seu programa deve pensar em centavos e não em dólares / euros.
Isso não deve impedir que a GUI traduza de volta para dólares / euros.
fonte
O BigDecimal pode ser usado, uma boa explicação de por que não usar Float ou Double pode ser vista aqui: Por que não usar Double ou Float para representar moeda?
fonte
JSR 354: API de Dinheiro e Moeda
O JSR 354 fornece uma API para representar, transportar e executar cálculos abrangentes com dinheiro e moeda. Você pode baixá-lo neste link:
JSR 354: Download da API de Dinheiro e Moeda
A especificação consiste no seguinte:
Exemplos de amostra da JSR 354: API Money e Currency:
Um exemplo de criação de um MonetaryAmount e impressão no console se parece com este ::
Ao usar a API de implementação de referência, o código necessário é muito mais simples:
A API também suporta cálculos com MonetaryAmounts:
CurrencyUnit e MonetaryAmount
MonetaryAmount possui vários métodos que permitem acessar a moeda atribuída, o valor numérico, sua precisão e muito mais:
As MonetaryAmounts podem ser arredondadas usando um operador de arredondamento:
Ao trabalhar com coleções de MonetaryAmounts, estão disponíveis alguns métodos úteis de filtragem, classificação e agrupamento.
Operações personalizadas MonetaryAmount
Recursos:
Manipulando Dinheiro e Moedas em Java com JSR 354
Analisando a API Java 9 Money and Currency (JSR 354)
Veja também: JSR 354 - Moeda e Dinheiro
fonte
Você deve usar o BigDecimal para representar valores monetários. Permite usar vários modos de arredondamento e, em aplicativos financeiros, o modo de arredondamento costuma ser um requisito difícil que pode até ser exigido por lei.
fonte
Eu usaria Joda Money
Ainda está na versão 0.6, mas parece muito promissor
fonte
Fiz uma marca de microbench (JMH) para comparar o Moneta (implementação JSR 354 da moeda java) com o BigDecimal em termos de desempenho.
Surpreendentemente, o desempenho do BigDecimal parece ser melhor que o do moneta. Eu usei a seguinte configuração moneta:
org.javamoney.moneta.Money.defaults.precision = 19 org.javamoney.moneta.Money.defaults.roundingMode = HALF_UP
Resultando em
Sinta-se à vontade para me corrigir se estiver faltando alguma coisa
fonte
Para um caso simples (uma moeda) é suficiente
Integer
/Long
. Mantenha o dinheiro em centavos (...) ou centésimo / milésimo de centavos (qualquer precisão que você precisar com divisor fixo)fonte
BigDecimal é o melhor tipo de dados a ser usado para a moeda.
Existem muitos contêineres para moeda, mas todos usam BigDecimal como o tipo de dados subjacente. Você não irá errar com o BigDecimal, provavelmente usando o BigDecimal.ROUND_HALF_EVEN.
fonte
Eu gosto de usar tipos minúsculos que envolvem um double, BigDecimal ou int, como as respostas anteriores sugeriram. (Eu usaria um duplo, a menos que surjam problemas de precisão).
Um tipo minúsculo oferece segurança de digitação, para que você não confunda dinheiro duplo com outras duplas.
fonte