Soma com casas decimais

4 respostas
W

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?

4 Respostas

X
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.
	 */
	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();
		}

	}
W

Se você vai lidar com valor numéricos, use BigDecimal diretamente (ao invés de double).

D

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

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.

Criado 1 de novembro de 2012
Ultima resposta 1 de nov. de 2012
Respostas 4
Participantes 5