Arredondar flutuante a cada R$ 0,05

Saudações pessoal,

Estou com um problema e não encontrei solução para isso no pai GOOGLE. Preciso arredondar um valor que recebo em uma variável double, até aí tudo bem, o ceil() resolveria meu problema, mas preciso arredondar o valor para os próximos 0,05 centavos.

Ex.
Entrada:
double preco = 12.4326;
double valor = 12.4753;

    Saída:
    preco = 12.45;
    valor  = 12.50;

Alguém sabe como posso resolver isso ?

talvez esse artigo lhe ajude a entender o “problema” de arredondamento do java.

http://www.jeebrasil.com.br/mostrar/47

abraços.

Multiplique o número por 20.0, arredonde (usando Math.rint talvez), e então divida de volta por 20.0.
Por que isso funciona?
É que há apenas 20 valores possíveis (0.00, 0.05, 0.10… até 0.95) para esses valores em centavos. É por isso que multiplicar por 20, arredondar, e dividir por 20 funciona.

preco = Math.rint (20.0 * preco) / 20.0;

É porque a resposta desse problema poderia ser encontrada na sua cabeça :stuck_out_tongue:

thingol,

Eu tentei resolver usando minha cabeça, porém estava cometendo um erro na multiplicação, usei 100.0 * preco ao invez de 20.0 * preco.

preco = Math.rint (100.0 * preco) / 20.0;

Obrigado pela força.

Ou ainda, você pode formatar o número usando o String.format() e passar para double depois. Algo como:

double a = 27d / 35d;
		double arred = Double.parseDouble(String.format(Locale.US, "%.2f", a));
		System.out.println(arred);
// saída: 0.77

Mas me parece que a solução acima é melhor.

Mas a sua solução não tem o arredondamento para múltiplo de 5 centavos.

Mas a sua solução não tem o arredondamento para múltiplo de 5 centavos. [/quote]

:oops: Verdade!!

Apenas arredondei duas casas decimais, mas não levando em consideração os múltiplos de 0.05. :shock: Falta de atenção…

Logo, fica valendo a sua solução.