Cálculo

Pessoal,

Tenha um fórmula matemática que está executando de forma diferente na máquina no cliente sem que eu modifique o código.
Já testei em diversas máquinas com as mesmas configurações e não consigo reproduzir…

Ou seja, o resultado comum é 132,2586, porém no cliente é 131,9552.

Alguém tem uma idéia de como corrigir isso visto que o certo é 132,2586.

Obrigada!

Facilita muito se vc postar o código…

Segue o código:

/**
	 * Calcular o Valor Presente de um titulo utilizando TIR Formula aplicada:
	 * VP = VT / ( (TAXA + 1) ^ (PRAZO / taxaMesAnoDia ( 1/21/252) )
	 * 
	 * @param value
	 * @param tax
	 * @param time
	 * @return
	 */
	public static BigDecimal calculateValorPresenteByTIR(BigDecimal fileValue,
			BigDecimal tax, Integer time, Integer taxaMesAnoDia) {
		if (fileValue == null || fileValue.doubleValue() <= 0) {
			throw new IllegalArgumentException(
					"The argument 'fileValue' must contain a value");
		}
		if (tax == null || tax.doubleValue() <= 0) {
			throw new IllegalArgumentException(
					"The argument 'tax' must contain a value");
		}

		double currentTax = roundDoubleValue(tax.doubleValue(), 2);
		double currentTime = roundDoubleValue(time.doubleValue(), 2);
		double currentFileValue = roundDoubleValue(fileValue.doubleValue(), 2);

		double p = (currentTime / taxaMesAnoDia);
		double t = ((currentTax / 100) + 1);
		return new BigDecimal(roundDoubleValue((currentFileValue / (Math.pow(t, p))), 2));
	}

Não adianta nada você declarar seu tipo como BigDecimal, se as contas você está fazendo com double.
Dê uma lida aqui:

[quote=ViniGodoy]Não adianta nada você declarar seu tipo como BigDecimal, se as contas você está fazendo com double.
Dê uma lida aqui:
http://blog.caelum.com.br/arredondamento-no-java-do-double-ao-bigdecimal/[/quote]

Você acha que utilizando esse código vai adiantar algo:

/**
	 * Calcular o Valor Presente de um titulo utilizando TIR Formula aplicada:
	 * VP = VT / ( (TAXA + 1) ^ (PRAZO / taxaMesAnoDia ( 1/21/252) )
	 * 
	 * @param value
	 * @param tax
	 * @param time
	 * @return
	 */
	public static BigDecimal calculateValorPresenteByTIR(BigDecimal currentFileValue,
			BigDecimal currentTax, Integer time, Integer taxaMesAnoDia) {
		if (currentFileValue == null || currentFileValue.doubleValue() <= 0) {
			throw new IllegalArgumentException(
					"The argument 'fileValue' must contain a value");
		}
		if (currentTax == null || currentTax.doubleValue() <= 0) {
			throw new IllegalArgumentException(
					"The argument 'tax' must contain a value");
		}

		BigDecimal currentTime = new BigDecimal(time.doubleValue());

		BigDecimal p = currentTime.divide(new BigDecimal(taxaMesAnoDia), 2, RoundingMode.HALF_EVEN);
		BigDecimal t = currentTax.divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN).add(new BigDecimal(1));
				
		return currentFileValue.divide(new BigDecimal((Math.pow(t.doubleValue(), p.doubleValue()))), 2, RoundingMode.HALF_EVEN);
	}

Provavelmente sim.

Existe alguma explicação para o cálculo ser diferente entre máquinas?

Sim. Primeiro, é preciso entender que números de ponto flutuante são naturalmente imprecisos em sua representação binária:

Devido a isso, fabricantes de hardware usam estratégias diferentes de arredondamento quando a imprecisão ocorre. Alguns usam registradores maiores, outros fazem calculos por firmware e pode sempre ter aqueles que mantém a imprecisão alta.

Existe um modificador do Java, chamado strictfp que pode ser usado sobre floats e doubles na tentativa de reduzir essa imprecisão. Ele força que a VM use a especificação do IEEE para fazer os calculos, desprezando o formato específico do processador (o que pode resultar em cálculos mais lentos, feitos por software). Você pode declarar um atributo ou classe com esse modificador (no caso da classe, ele valerá para todos os atributos e métodos floats da classe). Se eu não me engano, é possível ativar uma diretiva na VM que força calculos strictfp para todo programa também.

dá uma olhada aqui: http://javeiros.wordpress.com/2008/06/25/evite-float-e-double-se-voce-quer-respostas-exatas/

Obrigada a todos pelas dicas!
Amanhã irei testar e comunico à vocês o resultado.