Pessoal, recentemente tentei fazer o seguinte cálculo:
double vlr1=11.45;
double vlr2=8.015;
System.out.println("Resultado: "+(vlr1-vlr2));
e como resultado esperado para esse calculo, deveria ser : 3,435.
só que estou tendo a seguinte saída: 3.4349999999999987.
Alguém já lidou com algo semelhante a isto antes?
Já sim, use o código abaixo, ele faz o arredondamento.
[code]
/**
* Arredonda o double passado com o nrCasas de precisao especificado. O metódo utilizado é o ROUND_HALF_UP
*
* @param numero
* numero double
* @param nrCasas
* nr de casas
* @return um double arredondado.
*/
public static double round(double numero, int nrCasas) {
double fator = Math.pow(10, nrCasas);
if (numero * fator < Long.MAX_VALUE) {
return Math.round(numero * fator) / fator;
} else {
BigDecimal bdNumero = new BigDecimal(numero);
BigDecimal bdFator = new BigDecimal(10);
bdFator = bdFator.pow(nrCasas);
BigDecimal round = bdNumero.multiply(bdFator);
round = round.add(new BigDecimal(0.5));
return round.toBigInteger().divide(bdFator.toBigInteger()).doubleValue();
}
}[/code]
Se você vai lidar com valor numéricos, use BigDecimal diretamente (ao invés de double).
[quote=wilsontads]Pessoal, recentemente tentei fazer o seguinte cálculo:
double vlr1=11.45;
double vlr2=8.015;
System.out.println("Resultado: "+(vlr1-vlr2));
e como resultado esperado para esse calculo, deveria ser : 3,435.
só que estou tendo a seguinte saída: 3.4349999999999987.
Alguém já lidou com algo semelhante a isto antes?[/quote]
Isso ocorre pois a precisão não é o forte dos tipos double…
Outra forma, que não envolve você ficar usando BigDecimal:
double vlr1=11.45;
double vlr2=8.015;
System.out.printf("Resultado: %f", (vlr1-vlr2));
System.out.println();
O problema do Java é que ele insiste em formatar o número com todas as casas decimais depois da vírgula, em vez de apenas 6 (como é o caso de 99% das linguagens que existem por aí, inclusive o C, Basic, C# etc. )
Por isso você acha que é bug do Java.