| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2012 12:19:26
|
java
JavaBaby
![[Avatar]](/images/avatar/fa636c3d216834a2e0db24cc157ab5f0.jpg)
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." |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/01/2012 12:38:20
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/01/2012 03:23:32
|
raghy
Virtual Machine Man
![[Avatar]](/images/avatar/c233abe6b5d62eda374b43ec404cfdb4.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/01/2012 15:32:40
|
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/01/2012 22:05:25
|
davidbuzatto
Moderador
![[Avatar]](/images/avatar/7ba6d33c373fea56b7258003b16c68e5.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/01/2012 06:23:14
|
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/01/2012 08:23:17
|
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).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/01/2012 16:57:06
|
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).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/01/2012 08:04:32
|
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.
|
|
|
 |
|
|