Pontencia com alto expoente  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
java
JavaBaby
[Avatar]

Membro desde: 17/08/2005 10:13:31
Mensagens: 94
Offline

Boa tarde amigos, estou precisando elevar 1.1 a potencia 60, mas com o math.pow nao esta dando o valor correto.

Estou fazendo uma aplicaçao financeira (juros compostos) quando o expoente é pequeno da tudo ok, mas quamdo o parcelamento e alto (60 vezes) a formula nao funciona como deveria.

Vf=vp*(1+i)^n

Onde i e a taxa, vp e capital, n e o tempo

Alguem pode me dar uma ajuda?

"Nada é absoluto, tudo é relativo."
oyama
Virtual Machine Man

Membro desde: 19/04/2005 10:11:09
Mensagens: 572
Offline

Para valores monetários, nunca utilize double. Utilize BigDecimal http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#pow%28int%29.
raghy
Virtual Machine Man
[Avatar]

Membro desde: 14/01/2009 19:48:23
Mensagens: 629
Localização: florianopolis
Offline

quanto dá 1.1 na potencia 60.
e quanto o computador mostrou?


não sei porque com o math.pow, daria errado?
descobriu?

tamos aí!
Raghy@ig.com.br


curso técnico de programação de computadores (java, mysql) - preferência por programas em desktop swing e jogos java

[Email] [MSN]
abmpicoli
JavaTeenager

Membro desde: 27/07/2011 09:11:25
Mensagens: 164
Offline

raghy wrote:quanto dá 1.1 na potencia 60.
e quanto o computador mostrou?


não sei porque com o math.pow, daria errado?
descobriu?


Os números de tipo float e double são armazenados como Mantissa + Expoente.

Por exemplo, o número 1 Milhão, duzentos e trinta e quatro mil poderia ser armazenado como algo assim:

1,234 x 10^6 : 1234-06 só utilizando 6 dígitos.

Com isso consigo representar números muito grandes ou muito pequenos em um espaço de memória pequeno. Por exemplo, só com 6 dígitos consigo representar o número 1 quaquilhão: 1000-99. 1,000 x 10^99.

Porém isto gera dois problemas:

1) Há um limite máximo para o expoente a utilizar: Não consigo representar 10^100 na minha notação de exemplo, porque com dois dígitos só consigo chegar a 99.

2) Não consigo representar um número com mais de quatro dígitos de precisão. O número 1 milhao, quinhentos e quarenta e oito mil, duzentos e trinta e oito, por exemplo, não poderia ser representado com meu exemplo.

Por isso, o java tem o BigDecimal: ele consegue armazenar números muito grandes, porque ele faz como nós: se falta dígitos na precisão, ele põe mais.

This message was edited 1 time. Last update was at 22/01/2012 15:34:55


.x.
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Online

A classe BigDecimal tem um método pow, mas o método abaixo é mais "potente", mas acredito que o método pow de BigDecimal já resolva seu problema.


Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
abmpicoli
JavaTeenager

Membro desde: 27/07/2011 09:11:25
Mensagens: 164
Offline

Cara, discordo de que o método que você passou seja mais "potente". Por que um método que simplesmente multiplica 60 vezes o número é mais "potente" que o método nativo da api, que usa algoritmos muito mais eficientes, criados por doutores em ciência da computação? Isto é a mesma coisa que tentar fazer a soma de 1 a 100 somando 1 + 2 + 3 + 4 + 5...

A todos coloco a seguinte recomendação: use sempre que possível bibliotecas nativas à API ou já prontas de uso amplamente adotado, não tentem reinventar a roda. Porque você vai acabar gerando métodos menos eficientes e gerando fontes extras de erros de lógica dentro do seu programa.

A missão dos cientistas da computação é ficar pensando como fazer uma tarefa computacional ser calculada de forma mais precisa e eficiente...

davidbuzatto wrote:A classe BigDecimal tem um método pow, mas o método abaixo é mais "potente", mas acredito que o método pow de BigDecimal já resolva seu problema.


.x.
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

1.1 elevado a 60 na calculadora do Windows é 304.48163954141809957444929536028
1.1 usando o Java é 304.48163954141955 (veja que só o último dígito está "errado")


Para fazer esses cálculos de matemática financeira não é preciso fazer nenhuma mágica. Se você estivesse, no entanto, fazer algo como:
1.01 elevado a 720 (ou seja, juros de 1% ao mês durante 60 anos), dá um pouco mais de diferença (1292.3767115891916180624881537288 na calculadora do Windows, 1292.3767115891999 pelo Java).
abmpicoli
JavaTeenager

Membro desde: 27/07/2011 09:11:25
Mensagens: 164
Offline

E, notem: Tanto o valor do windows quanto o valor do java usando double estão "errados". A calculadora do windows também usa números de ponto flutuante e, portanto, não são confiáveis para cálculos com números muito grandes, demandando muita precisão.

Usando o seguinte código java:

gera o número

304.481639541418099574449295360278774639038415066698088621947601


entanglement wrote:1.1 elevado a 60 na calculadora do Windows é 304.48163954141809957444929536028
1.1 usando o Java é 304.48163954141955 (veja que só o último dígito está "errado")


Para fazer esses cálculos de matemática financeira não é preciso fazer nenhuma mágica. Se você estivesse, no entanto, fazer algo como:
1.01 elevado a 720 (ou seja, juros de 1% ao mês durante 60 anos), dá um pouco mais de diferença (1292.3767115891916180624881537288 na calculadora do Windows, 1292.3767115891999 pelo Java).
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Bom, eu mesmo estou estudando matemática financeira, e normalmente não é necessário nada mais preciso que os cálculos feitos numa planilha do Excel (que usa o mesmo ponto flutuante (double) que o Java, para fazer os cálculos).

A única coisa que o Excel faz melhor é que ele não mostra tantos dígitos significativos - o Java mostra muitos dígitos e isso confunde muito as pessoas, que acham que as contas que o Java faz estão erradas.
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team