Formatando números

Olá galera,
gostaria de saber como eu faço para formatar números sem usar os formatadores do java, por exemplo tenho um código:

double v1,v2;

v1 = 10;
v2 = 3;

System.out.println(v1 / v2);

Isso me retorna 3.33333…

Gostaria de obter um resultado 3.33 sem utilizar isso por exemplo, System.out.printf( “%.2f”, x );
Caso tenha ficado mal explicado me falem ae. ^^
Desde já agradeço qualquer ajuda. =)

Não tem como. Por que é que está com preguiça de usar os formatadores?

Ainda mais que provavelmente o pessoal vai lhe sugerir alguma coisa bizarra como:

double v1, v2;
v1 = 10;
v2 = 3;
double v3 = Math.rint (v1 / v2 * 100) / 100; // deveria dar o valor 3.33
System.out.println (v3);

Por que é que isso é bizarro e errado? Porque v3 pode ser impresso pelo Java como algo mais esquisito, como

3.32999999999973

ou coisa parecida. Não é exatamente um bug, é que o Java, por padrão, imprime cerca de 15 dígitos significativos no caso de double, e alguns desses dígitos acabam sendo “errados” (mas devido à representação interna do ponto flutuante, não devido a algum eventual bug).

Tenta usar o DecimalFormat().

http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html

Então galera… na verdade é um desafio que passaram. Depois eu vejo como faz e posto aqui… Valeu.

Acho que agora entendi. Suponha que o número seja fácil de formatar (por “fácil” eu digo não ter de usar algoritmos muito complicados para levar em conta um monte de casos particulares que podem ocorrer quando se usa double)

Por exemplo, você quer criar um método que seja mais ou menos assim:

public String formatarComNCasas (double x, int nCasas) {
    ...
    return ...;
}

E o resultado esperado para formatarComNCasas (10.0 / 3.0, 2) fosse “3.33”.

É isso?

A melhor prática creio que é usar a classe BigDecimal.

Outra pratica “gambiarra” que funcionaria era transformar numa string e pegar a substring dela, haha! é gambs 100% mas funfa, ja utilizei :slight_smile:

Então galera, eu não sei como é, o professor deu só uma dica, tem que usar cast. hehe, eu tentei algumas coisas aqui mas sem sucesso… De quaquer forma ele falou que iria revelar como é na próxima aula, que é semana que vem. ^^
Tipo, se eu fizer assim:

public static void main (String [] args){
	double v1,v2;
	v1 = 10;
	v2 = 3;

	System.out.println((float) (v1 / v2));
	}

As decimais do resultado já caem, mas eu quero que só apresentem 2 números depois da vírgula… 3,33.

Ele está ensinando uma coisa bem ingênua, que pode quebrar, pelo que imagino.

Acho que ele está sugerindo fazer a mesma coisa que eu disse que é bizarra (ou seja, multiplicar por 100, arredondar, e dividir por 100).

É que em linguagens onde os doubles são mostrados, por default, com apenas 6 casas depois da vírgula, a solução bizarra funciona.