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.
/** * 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. */publicstaticdoubleround(doublenumero,intnrCasas){doublefator=Math.pow(10,nrCasas);if(numero*fator<Long.MAX_VALUE){returnMath.round(numero*fator)/fator;}else{BigDecimalbdNumero=newBigDecimal(numero);BigDecimalbdFator=newBigDecimal(10);bdFator=bdFator.pow(nrCasas);BigDecimalround=bdNumero.multiply(bdFator);round=round.add(newBigDecimal(0.5));returnround.toBigInteger().divide(bdFator.toBigInteger()).doubleValue();}}
W
wagnerfrancisco
Se você vai lidar com valor numéricos, use BigDecimal diretamente (ao invés de double).
D
drsmachado
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?
Isso ocorre pois a precisão não é o forte dos tipos double…
E
entanglement
Outra forma, que não envolve você ficar usando BigDecimal:
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.