Estou desenvolvendo uma aplicação comercial que lê muitos números do banco de dados e faz algumas contas com eles (adição, subtração, etc).
O problema é que (incrivelmente) as contas feitas dão resultado errado!Por exemplo, uma conta que era pra dar 94.70 ta dando 94.69999999999999, e uma que era pra dar 10 ta tando 10.[telefone removido].
O diferença é mínima, mas eu não posso apresentar esses números na interface com usuário pro cliente! Mesmo porque esses números representam dinheiro.
Fiz um programinha teste pra conferir se o problema não vinha do banco de dados, e realmente não vem!
Vejam:
Pedro, valeu a intenção mas isso não resolve meu problema porque ele arredonda 94.69999999 pra 95 e eu preciso de 94.70!
pedromuyala
Este link também pode te ajudar! Não deixe de ver!
Espero novamente ter ajudado!
L
luisborsari
Pedro, valeu! O link ajudou!
O problema é que vou ter que formatar os números toda hora. Sem falar que o format retorna String, o que vai me obrigar a fazer parse de volta quando quiser fazer conta.
Mas se o jeito é esse, td bem!
De qualquer maneira, muito obrigado pela atenção!
allanmarques
Não use double e float quando estiver manipulando valores monetários ou quiser respostas exatas. Nesses casos use BigDecimal.
Esse link explica o problema: http://www.jeebrasil.com.br/mostrar/47
[]s
L
luisborsari
Valeu Allan!
Vai ser chato pra caramba usar BigDecimal, mas pelo que li tem que ser!
Valeu d+!
allanmarques
Já sofri por causa disso rsrsrs
[]s
xandevieira
Uma coisa que faço é criar uma classe utilitaria, e colocar os metodos staticos.
Assim não precisa ficar criando toda hora, basta chamar a classe
ex.
publicfinalclassNumberUtils{/** * Arredonda o double passado com o nrCasas de precisao especificado. * * O metódo utilizado que visa diminuir os erros * de arredondamento acumulados. * Ex: round(2.335, 2) = 2.33 * round(2.345, 2) = 2.35 * * @param numero numero double * @param nrCasas nr de casas * @return um double arredondado. */publicstaticdoubleround(doublenumero,intnrCasas){returnround(numero,nrCasas,BigDecimal.ROUND_HALF_UP);}publicstaticdoubleround(doublenumero){returnround(numero,2,BigDecimal.ROUND_HALF_UP);}}