Como efetuar operações de ponto flutuante com MIDP 2.0 e CLDC 1.1  XML
Índice dos Fóruns » Google Android e Java Micro Edition (ME)
Autor Mensagem
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

Boa tarde!
Estou tentando efetuar operações de ponto flutuante com double, para efetuar cálculos com moeda.
No entanto, sempre ocorre uma imprecisão indesejável de 0.01 para mais (ou para menos).
Gostaria de saber como posso contornar isso para que os cálculos com moeda sejam precisos. Já procurei a classe BigDecimal, mas parece que ela não existe para Java em dispositivos móveis...

"Go ahead, make my day!"
xwillianss
JavaGuru
[Avatar]

Membro desde: 17/05/2008 23:29:34
Mensagens: 247
Localização: Itabuna - Bahia - Brazil
Offline

Já tentou long?

Willian Silva
Técnico em Análise de Sistemas
[MSN]
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

Não tentei..como eu posso usar long para efetuar cálculos com ponto flutuante?
Como faço essa utilização?

"Go ahead, make my day!"
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

Não..não tentei ainda. Como utilizo long para efetuar operações com ponto flutuante?

"Go ahead, make my day!"
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

O que ele lhe sugeriu é fazer as contas em centavos (ou em décimos de centavos). Dá um pouco de trabalho...
[WWW]
npereirajr
JavaTeenager

Membro desde: 04/03/2008 15:21:35
Mensagens: 157
Localização: Rio de Janeiro
Offline

Porque vc não usa double?

double numero1 = 6.5;
double numero2 = 66.7;
double numero3 = numero1 / numero2;

Nelson Pereira Junior

Desenvolvedor Web e Móvel

Blog sobre desenvolvimento de aplicações móveis, J2ME, BlackBerry, FlashLite, Android, e mais:
Blog: DevMobile.blog.br

Mobile Phone: +55 21 7623-0151

GTalk e MSN: npereirajr@gmail.com
[WWW] [MSN]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

Bem, eu faria as operações utilizando ints ou longs com o valor em centavos.

Outra alternativa é copiar e colar a classe BigDecimal e mudar o pacote.

Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
npereirajr
JavaTeenager

Membro desde: 04/03/2008 15:21:35
Mensagens: 157
Localização: Rio de Janeiro
Offline

Pra que copiar classe BigDecimal, e fazer o cauculo em centavos se pode-se usar double? Pra que inventar se já está pronto?

Nelson Pereira Junior

Desenvolvedor Web e Móvel

Blog sobre desenvolvimento de aplicações móveis, J2ME, BlackBerry, FlashLite, Android, e mais:
Blog: DevMobile.blog.br

Mobile Phone: +55 21 7623-0151

GTalk e MSN: npereirajr@gmail.com
[WWW] [MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline


Outra alternativa é copiar e colar a classe BigDecimal e mudar o pacote.

A classe BigDecimal é imensa; não vai caber em um dispositivo limitado.
[WWW]
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

Quanto a efetuar o cálculo com centavos, entendi mais ou menos..
o problema é que vou fazer diversos tipos de cálculo, não somente soma, mas multiplicação, divisão..é aí que acho que complica utilizar long na parte inteira e fracionária...vou ter que simular esses tipos, talvez "precisar" onde a vírgula vai cair...passar um valor do cálculo de centavos para a parte inteira..

O tipo Double eu já estava utilizando. Como expliquei no início do tópico, ele apresenta imprecisão no cálculo de operações com moeda..fica dando uma diferença muito pequena para cima e para baixo.

A classe BigDecimal eu teria que pegar do Math e readaptá-la né?

"Go ahead, make my day!"
diego_qmota
JavaEvangelist
[Avatar]

Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline

Em centavos converteria:
R$1,59 = 159 centavos...
Eu faço as operações e uso um método para converter de volta para Double?

"Go ahead, make my day!"
npereirajr
JavaTeenager

Membro desde: 04/03/2008 15:21:35
Mensagens: 157
Localização: Rio de Janeiro
Offline

Quer dizer que se vc fizer:

double n1 = 3.51;
double n2 = n1 * 2;

O resultado em n2 não será 7,02???

Nelson Pereira Junior

Desenvolvedor Web e Móvel

Blog sobre desenvolvimento de aplicações móveis, J2ME, BlackBerry, FlashLite, Android, e mais:
Blog: DevMobile.blog.br

Mobile Phone: +55 21 7623-0151

GTalk e MSN: npereirajr@gmail.com
[WWW] [MSN]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

npereirajr wrote:Porque vc não usa double?

double numero1 = 6.5;
double numero2 = 66.7;
double numero3 = numero1 / numero2;


Porque float e double sofrem com erros de arredondamentos que se traduzem em um grande desastre em cálculos financeiros.

Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

thingol wrote:

Outra alternativa é copiar e colar a classe BigDecimal e mudar o pacote.

A classe BigDecimal é imensa; não vai caber em um dispositivo limitado.


E se for copiado apenas o mínimo necessário? Tipo, os métodos que não são utilizados dela não precisam vir junto.
[MSN]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

diego_qmota wrote:Em centavos converteria:
R$1,59 = 159 centavos...
Eu faço as operações e uso um método para converter de volta para Double?


Para que converter em double? Esqueça o double e simplesmente não o use em lugar algum! Deixe sempre-sempre-sempre em centavos. Apenas na hora de mostrar para o usuário você enfia a vírgula lá, trabalhando com String:

This message was edited 2 times. Last update was at 01/10/2008 10:01:46


Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
 
Índice dos Fóruns » Google Android e Java Micro Edition (ME)
Ir para:   
Powered by JForum 2.1.8 © JForum Team