Instanciando BigDecimal

166 views
Skip to first unread message

Frederico Guedes Pereira

unread,
Apr 25, 2007, 12:42:56 PM4/25/07
to pb...@googlegroups.com
Olá Pessoal,

Alguem sabe como instanciar um BigDecimal a partir de um string onde o número usa vírgula para separar decimais? Exemplo:

BigDecimal num = new BigDecimal("2,3");

Isso ai acima dá erro. A classe BigDecimal nao tem um construtor com Locale. Em tempo: o numero usa virgula porque é digitado numa GUI por um usuario brasileiro :-)

Fred

Sebastião Júnior

unread,
Apr 25, 2007, 12:55:40 PM4/25/07
to pb...@googlegroups.com
Fred,

tenta assim: BigDecimal num = new BigDecimal("2,3".replace(",","."));

talvez precise de validação, mas resolve.

--
Sebastião E. P. Rabelo Júnior
http://www.compose.ufpb.br/~sebastiao

Frederico Guedes Pereira

unread,
Apr 25, 2007, 1:04:10 PM4/25/07
to pb...@googlegroups.com
Boa!

Acabei fazendo de uma maneira mais complicada:

public static void main(String[] args) {
        String numero = "123,56";
        NumberFormat nf = NumberFormat.getInstance();
        try {
            Number n = nf.parse(numero);
            BigDecimal b = new BigDecimal(n.toString());
            System.out.println("Number: " + n);
            System.out.println("Big Decimal:" + b);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

O seu é muito mais simples e eficiente!

Fred

Em 25/04/07, Sebastião Júnior <panm...@gmail.com> escreveu:

Danillo Cesar

unread,
Apr 25, 2007, 6:00:27 PM4/25/07
to pb...@googlegroups.com
Vc pode fazer assim:

int numero = Integer.parseInt("123,05");
BigDecimal b = new BigDecimal(numero);

Danillo

Frederico Guedes Pereira

unread,
Apr 25, 2007, 9:51:36 PM4/25/07
to pb...@googlegroups.com
Danillo,

Esse parseInt aí gera uma exceção, nao? O número no string não é inteiro.

Fred

Em 25/04/07, Danillo Cesar < danil...@gmail.com> escreveu:
Vc pode fazer assim:

int numero = Integer.parseInt ("123,05");

Danillo Cesar

unread,
Apr 25, 2007, 9:54:57 PM4/25/07
to pb...@googlegroups.com
Se os numeros passados na GUI forem só decimais então:

double numero = Integer.parseDouble ("123,05");

Frederico Guedes Pereira

unread,
Apr 25, 2007, 10:04:50 PM4/25/07
to pb...@googlegroups.com
Danillo,

O problema é que quando vc tenta converter um número na base decimal para um número double ou float, isso pode gerar uma imprecisao, pois a conversao pode produzir uma dízima periodica no número binário. Ex (hipotetico): o número " 2.34" em decimal pode produzir uma dízima quando convertido, isso porque sua versao em binário não é precisa, o binário lá por baixo pode ser na verdade 2.3399999. Ou seja, nao dá para converter 2.34 em binário sem perder precisao. Esse erro vai se acumulando e pode produzir uma diferenca enorme quando o valor representa dinheiro! Float e Double nao devem ser usados para representar dinheiro. Daí que eu preciso converter o número no string direto para o BigDecimal, sem passar por Double ou Float.

Danillo Cesar

unread,
Apr 25, 2007, 10:09:29 PM4/25/07
to pb...@googlegroups.com
Ok, entendi o seu problema.

Flw!!!

Gustavo Cavalcanti

unread,
Apr 25, 2007, 11:23:33 PM4/25/07
to pb...@googlegroups.com
O Double.parseDouble() também daria certo não é? Creio que sua implementação leva em conta os dois separadores "ponto" e "vírgula".
[]'s

Frederico Guedes Pereira

unread,
Apr 26, 2007, 7:20:56 AM4/26/07
to pb...@googlegroups.com
Gustavo,

Também não, exatamente pela imprecisão na representação binária de números decimais em ponto flutuante.

Fred

Em 26/04/07, Gustavo Cavalcanti <xgu...@gmail.com> escreveu:
O Double.parseDouble () também daria certo não é? Creio que sua implementação leva em conta os dois separadores "ponto" e "vírgula".

Daniel Lacet de Faria Fireman

unread,
Apr 26, 2007, 9:51:38 AM4/26/07
to pb...@googlegroups.com
E aí Fred, problema resolvido ?

[]s
Fireman


Frederico Guedes Pereira wrote:
> Gustavo,
>
> Também não, exatamente pela imprecisão na representação binária de
> números decimais em ponto flutuante.
>
> Fred
>

> Em 26/04/07, *Gustavo Cavalcanti * <xgu...@gmail.com
> <mailto:xgu...@gmail.com>> escreveu:


>
> O Double.parseDouble () também daria certo não é? Creio que sua
> implementação leva em conta os dois separadores "ponto" e "vírgula".
> []'s
>
>
>

> Em 25/04/07, * Danillo Cesar* <danil...@gmail.com
> <mailto:danil...@gmail.com>> escreveu:


>
> Ok, entendi o seu problema.
>
> Flw!!!
>
>

> On 4/25/07, *Frederico Guedes Pereira* <
> fredgued...@gmail.com


> <mailto:fredgued...@gmail.com>> wrote:
>
> Danillo,
>
> O problema é que quando vc tenta converter um número na
> base decimal para um número double ou float, isso pode
> gerar uma imprecisao, pois a conversao pode produzir uma
> dízima periodica no número binário. Ex (hipotetico): o
> número " 2.34" em decimal pode produzir uma dízima quando
> convertido, isso porque sua versao em binário não é
> precisa, o binário lá por baixo pode ser na verdade
> 2.3399999. Ou seja, nao dá para converter 2.34 em binário
> sem perder precisao. Esse erro vai se acumulando e pode
> produzir uma diferenca enorme quando o valor representa
> dinheiro! Float e Double nao devem ser usados para
> representar dinheiro. Daí que eu preciso converter o
> número no string direto para o BigDecimal, sem passar por
> Double ou Float.
>
>
> Fred
>

> Em 25/04/07, *Danillo Cesar* < danil...@gmail.com
> <mailto:danil...@gmail.com>> escreveu:


>
> Se os numeros passados na GUI forem só decimais então:
>
> double numero = Integer.parseDouble ("123,05");
>
> BigDecimal b = new BigDecimal(numero);
>
> Danillo
>
>
>

> On 4/25/07, *Frederico Guedes Pereira* <
> fredgued...@gmail.com


> <mailto:fredgued...@gmail.com>> wrote:
>
> Danillo,
>
> Esse parseInt aí gera uma exceção, nao? O número
> no string não é inteiro.
>
> Fred
>

> Em 25/04/07, *Danillo Cesar* <
> danil...@gmail.com
> <mailto:danil...@gmail.com>> escreveu:


>
> Vc pode fazer assim:
>
> int numero = Integer.parseInt ("123,05");
> BigDecimal b = new BigDecimal(numero);
>
> Danillo
>
>

> On 4/25/07, * Frederico Guedes Pereira *
> <fredgued...@gmail.com


> <mailto:fredgued...@gmail.com>> wrote:
>
> Boa!
>
> Acabei fazendo de uma maneira mais complicada:
>
> public static void main(String[] args) {
> String numero = "123,56";
> NumberFormat nf =
> NumberFormat.getInstance();
> try {
> Number n = nf.parse(numero);
> BigDecimal b = new
> BigDecimal(n.toString());
> System.out.println("Number: "
> + n);
> System.out.println("Big
> Decimal:" + b);
> } catch (ParseException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
>
> }
>
> O seu é muito mais simples e eficiente!
>
> Fred
>

> Em 25/04/07, *Sebastião Júnior*
> <panm...@gmail.com
> <mailto:panm...@gmail.com> > escreveu:


>
> Fred,
>
> tenta assim: BigDecimal num = new
> BigDecimal("2,3".replace(",","."));
>
> talvez precise de validação, mas resolve.
>
> --
> Sebastião E. P. Rabelo Júnior
> http://www.compose.ufpb.br/~sebastiao

> <http://www.compose.ufpb.br/%7Esebastiao>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> >

Frederico Guedes Pereira

unread,
Apr 26, 2007, 12:48:24 PM4/26/07
to pb...@googlegroups.com
Sim! :-)
Acebi adotando minha solucao, pois é mais rigorosa na hora de impedir valores malucos (tais como 1.345.67). Agora é o problema do Log4J...eheheheh

Até o proximo bug...

Fred

Em 26/04/07, Daniel Lacet de Faria Fireman <daniel...@gmail.com> escreveu:

André Figueiredo

unread,
Apr 27, 2007, 7:14:22 AM4/27/07
to PBJug e CGJug
Olá pessoal, só para acrescentar...

Ao invés de utilizar os construtores da classe é melhor utilizar os
seus factory methods (valueOf). Como BigDecimal é uma classe immutable
usando tais métodos você permite que a classe reuse alguns desses
objetos através de cache, pool, etc....

Qualquer dúvida é só olhar: http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html

Abraços,
André Figueiredo.

On 26 abr, 13:48, "Frederico Guedes Pereira"


<fredguedespere...@gmail.com> wrote:
> Sim! :-)
> Acebi adotando minha solucao, pois é mais rigorosa na hora de impedir
> valores malucos (tais como 1.345.67). Agora é o problema do Log4J...eheheheh
>
> Até o proximo bug...
>
> Fred
>

> Em 26/04/07, Daniel Lacet de Faria Fireman <danielfire...@gmail.com>


> escreveu:
>
>
>
> > E aí Fred, problema resolvido ?
>
> > []s
> > Fireman
>
> > Frederico Guedes Pereira wrote:
> > > Gustavo,
>
> > > Também não, exatamente pela imprecisão na representação binária de
> > > números decimais em ponto flutuante.
>
> > > Fred
>
> > > Em 26/04/07, *Gustavo Cavalcanti * <xgu...@gmail.com
> > > <mailto:xgu...@gmail.com>> escreveu:
>
> > > O Double.parseDouble () também daria certo não é? Creio que sua
> > > implementação leva em conta os dois separadores "ponto" e "vírgula".
> > > []'s
>

> > > Em 25/04/07, * Danillo Cesar* <danillo...@gmail.com
> > > <mailto:danillo...@gmail.com>> escreveu:


>
> > > Ok, entendi o seu problema.
>
> > > Flw!!!
>
> > > On 4/25/07, *Frederico Guedes Pereira* <

> > > fredguedespere...@gmail.com


> > > <mailto:fredguedespere...@gmail.com>> wrote:
>
> > > Danillo,
>
> > > O problema é que quando vc tenta converter um número na
> > > base decimal para um número double ou float, isso pode
> > > gerar uma imprecisao, pois a conversao pode produzir uma
> > > dízima periodica no número binário. Ex (hipotetico): o
> > > número " 2.34" em decimal pode produzir uma dízima quando
> > > convertido, isso porque sua versao em binário não é
> > > precisa, o binário lá por baixo pode ser na verdade
> > > 2.3399999. Ou seja, nao dá para converter 2.34 em binário
> > > sem perder precisao. Esse erro vai se acumulando e pode
> > > produzir uma diferenca enorme quando o valor representa
> > > dinheiro! Float e Double nao devem ser usados para
> > > representar dinheiro. Daí que eu preciso converter o
> > > número no string direto para o BigDecimal, sem passar por
> > > Double ou Float.
>
> > > Fred
>

> > > Em 25/04/07, *Danillo Cesar* < danillo...@gmail.com
> > > <mailto:danillo...@gmail.com>> escreveu:


>
> > > Se os numeros passados na GUI forem só decimais então:
>
> > > double numero = Integer.parseDouble ("123,05");
>
> > > BigDecimal b = new BigDecimal(numero);
>
> > > Danillo
>
> > > On 4/25/07, *Frederico Guedes Pereira* <

> > > fredguedespere...@gmail.com


> > > <mailto:fredguedespere...@gmail.com>> wrote:
>
> > > Danillo,
>
> > > Esse parseInt aí gera uma exceção, nao? O número
> > > no string não é inteiro.
>
> > > Fred
>
> > > Em 25/04/07, *Danillo Cesar* <

> > > danillo...@gmail.com
> > > <mailto:danillo...@gmail.com>> escreveu:


>
> > > Vc pode fazer assim:
>
> > > int numero = Integer.parseInt ("123,05");
> > > BigDecimal b = new BigDecimal(numero);
>
> > > Danillo
>
> > > On 4/25/07, * Frederico Guedes Pereira *

> > > <fredguedespere...@gmail.com


> > > <mailto:fredguedespere...@gmail.com>> wrote:
>
> > > Boa!
>
> > > Acabei fazendo de uma maneira mais
> > complicada:
>
> > > public static void main(String[] args) {
> > > String numero = "123,56";
> > > NumberFormat nf =
> > > NumberFormat.getInstance();
> > > try {
> > > Number n = nf.parse(numero);
> > > BigDecimal b = new
> > > BigDecimal(n.toString());
> > > System.out.println("Number: "
> > > + n);
> > > System.out.println("Big
> > > Decimal:" + b);
> > > } catch (ParseException e) {
> > > // TODO Auto-generated catch
> > block
> > > e.printStackTrace();
> > > }
>
> > > }
>
> > > O seu é muito mais simples e eficiente!
>
> > > Fred
>
> > > Em 25/04/07, *Sebastião Júnior*

> > > <panmor...@gmail.com
> > > <mailto:panmor...@gmail.com> > escreveu:

Reply all
Reply to author
Forward
0 new messages