Arredondamento de Números

8 respostas
L

Galera, estou com alguns problemas aqui que estão muito chatos de resolver.
Quero ter um número arredondado da forma: 100,105 virar 100,11.
Estou tentando utilizar o BigDecimal desta forma:

Locale.setDefault (new Locale ("pt", "BR"));
DecimalFormat df = new DecimalFormat("#,##0.00");
String s = "123.456.789,10445";
double d = df.parse(s).doubleValue();
BigDecimal bd = new BigDecimal(d);
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);

Infelizmente não importa qual o tipo de arredondamento que eu passe no BigDecimal ele não faz isso. Se alguém for tentar testar use número como:
100.004777 ( deveria arredondar para 100,01) ou números do tipo com mais de 3 casas.

Qualquer ajuda é bem vinda, obrigado.

8 Respostas

T
import java.math.*;
import java.text.*;
import java.util.*;

class TesteBD {
    public static void main(String[] args) throws ParseException {
        Locale.setDefault (new Locale ("pt", "BR"));
        DecimalFormat df = new DecimalFormat("#,##0.00");
        df.setParseBigDecimal(true); // requer Java 5.0 ou superior
        String s = "123.456.789,10445";
        BigDecimal bd = (BigDecimal) df.parse(s);
        bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println (bd);
        System.out.println (df.format (bd));
    }
}

Resultado:

123456789.10
123.456.789,10
T

100.004777 é arredondado para 100.00. Por que é que deveria ser arredondado para 100.01?

L

thingol:
100.004777 é arredondado para 100.00. Por que é que deveria ser arredondado para 100.01?

Porque cara, os 7 fazem o 4 virar 5…e com isso o 100.00 vira 100.01.

thingol: aqui os servidores só tem Java 1.4 =\

T

Mas arredondamento não é feito da direita para a esquerda (você é japonês por acaso)? Que eu saiba, 100.004777 deve ser arredondado para 100.00 e 100.005 deve ser arredondado para 100.00 (se você usar “banker’s rounding”) ou 100.01 (se você sempre arredondar 5 para cima, ou seja, usar ROUND_HALF_UP como mostrado).

De qualquer maneira, vou ver o que ocorre se não usar o “setParseBigDecimal” que não existe em Java 1.4.

T
import java.math.*;
import java.text.*;
import java.util.*;

class TesteBD {
    public static void main(String[] args) throws ParseException {
        Locale.setDefault (new Locale ("pt", "BR"));
        DecimalFormat df = new DecimalFormat("#,##0.00");
        String s = "100,004777";
        // BigDecimal requer um número decimal, mas sem separadores
        // de milhar e com um ponto decimal. 
        NumberFormat nf = new DecimalFormat ("0.00", new 

DecimalFormatSymbols (Locale.US));
        BigDecimal bd = new BigDecimal (nf.format (df.parse (s)));
        System.out.println (bd);
        System.out.println (df.format (bd));
    }
}

Obviamente, como há um “double” no meio (só que disfarçado), vai haver problemas com números grandes.

L

É, to vendo que não tem EXATAMENTE o que eu preciso =.

Acho que vou ter que fazer um método horripilante no mãozão mesmo.Ir olhando de numero em número a parte fracionária e somar se for maior ou igual a cinco. =/

T

Queria saber com quem você aprendeu que 100,004777 tem de ser arredondado para 100,01. Acho isso sinistro.

L

Cara, isto não é tão sinistro assim. Nem tão esquisito quanto você deve estar achando. Por que que 100,006 arredonda 100,01 e porque 100,0046 não, segundo sua idéia?

100,0046 -> 100,005 -> 100,01. Não vejo esta ‘sinistrez’ toda que você está descrevendo.

Só estava querendo um arredondamento mais ‘rigoroso’. Infelizmente não achei nada assim, vou ter que ‘horripilar’ trabalhando com String como disse acima.

=.

Criado 23 de março de 2007
Ultima resposta 27 de mar. de 2007
Respostas 8
Participantes 2