Transformando 0.33333333333 em 0.3 / 0.166666666666666 em 0,16

11 respostas
carlos_maia

Bom dia pessoal,
gostaria de saber como eu posso transformar um double 0.333333333 em 0.3 e 0.166666666666 en 0.16 utilizando a linguagem JAVA

11 Respostas

mauricioadl

se nao tiver problemas em arredondar os valores, assim faz:

DecimalFormat df = new DecimalFormat("##.##;(00.00)");

System.out.println(df.format(0.333333333));

System.out.println(df.format(0.166666666666));
E

Pode usar o Math.round e o Math.floor, dependendo da sua “criatividade”:

double a = Math.round((1.0/3)*10)/10.0;
double b = Math.floor((1.0/3)*10)/10.0;

Ou, como é dízima, pode fazer assim:

double a = 1.0/3; // 0.33333
  double b = a - a/10; // aqui você também pode fazer uma lógica para tirar a parte que não é dízima.

Sinceramente, prefiro a primeira opção.

Giulliano

Muito mais simples usar o BigDecimal.

BigDecimal decimal = new BigDecimal(0.3333d);
		decimal.setScale(2, RoundingMode.HALF_UP); //Além de permitir arredondamento, lhe permite escolher se será para cima ou para baixo
L

para calculos com casas decimais, eu sempre uso bigdecimal, principalmente se for algo que mecha com o lado financeiro

Enadrov

double valor = Double.paserDouble(String.format("%.2f", 0.333333333)); double valor2 = Double.parseDouble(String.format("%.2f", 0.166666666666));

jaboot
Giulliano:
Muito mais simples usar o BigDecimal.
BigDecimal decimal = new BigDecimal(0.3333d);
		decimal.setScale(2, RoundingMode.HALF_UP); //Além de permitir arredondamento, lhe permite escolher se será para cima ou para baixo
++ O único problema de usar o BigDecimal é o custo. Mas como as vezes o que mais importa no sistema são os valores ($$$), eu acho que vale a pena.
Giulliano
jaboot:
Giulliano:
Muito mais simples usar o BigDecimal.
BigDecimal decimal = new BigDecimal(0.3333d);
		decimal.setScale(2, RoundingMode.HALF_UP); //Além de permitir arredondamento, lhe permite escolher se será para cima ou para baixo
++ O único problema de usar o BigDecimal é o custo. Mas como as vezes o que mais importa no sistema são os valores ($$$), eu acho que vale a pena.

jaboot ou wellington.nogueira

vocês saberiam responder o quanto mais lento é o BigDecimal para o Double. Por que se estamos falando de nanosegundos ou milisegundos, podemos descartar essa lentidão.

jaboot

Faz um loop-teste com os seus cálculos e vê a diferença.

Eu sinceramente não sei quantos milisegundos vai dar de diferença.

Giulliano

jaboot:
Faz um loop-teste com os seus cálculos e vê a diferença.

Eu sinceramente não sei quantos milisegundos vai dar de diferença.

legal pessoal…a ideia era só deixar bem claro que não vale a pena descartar bigdecimal, achando que ele prejudicaria a performance (salvo casos extermos).

aproveitando sugiro a todos darem uma lida no post da caelum http://blog.caelum.com.br/arredondamento-no-java-do-double-ao-bigdecimal/

[]'s a todos.

WellingtonRamos
Giulliano:
Muito mais simples usar o BigDecimal.
BigDecimal decimal = new BigDecimal(0.3333d);
		decimal.setScale(2, RoundingMode.HALF_UP); //Além de permitir arredondamento, lhe permite escolher se será para cima ou para baixo
Concordo em partes. Lembrando que se o double pasado no parâmetro for resultado de cálculo, o mesmo pode estar distorcido e não representando dízima. Em caso de arredondamentos como citado (scale = 2) não vejo problemas, mas nunca se sabe...

Prefira que as operações matemáticas (soma, subtração, multiplicação e divisão) sejam realizadas pelo BigDecimal (entretanto, esse cálculo fica mais lento).

WellingtonRamos

@Giulliano, a questão é que vc vai gerar overhead por passar a trabalhar com o BigDecimal. Em geral não deve influenciar mas tudo vai depender do volume de cálculos a serem realizados.

Entretanto, é muito comum utilizar valores flutuantes para tratar valores monetários e, menos comum, para valores de engenharia. E em ambos casos, a precisão tem maior importância/significância que a performance.

Se quiser saber a diferença, pode fazer como sugeriu o @jaboot mas faça o monitoramento acompanhado de um Profiler (Ex.: JVisualVM).

Criado 15 de dezembro de 2011
Ultima resposta 16 de dez. de 2011
Respostas 11
Participantes 8