Arredondando um double

Aproveitando o outro topico que esta ai.

Quero algo que possa fazer o seguinte
3.7691231233

me devolva
3.77

e se for

3.7641231233
devolve
3.76

Nao vale multiplicar por 100, dar round e dividir por 100! Quero saber da API mesmo. Tem?

Paulo,

talvez seja pior do que multiplicar por 100, etc. e tal mas é pela API…
dá uma olhada no tempo que leva… :lol:

import java.math.*;

public class TestRound {
	
	public static void main(String []args){
	
		long ti = System.currentTimeMillis();
		TestRound t = new TestRound();
		t.doTest(3.7641231233d);
		ti = System.currentTimeMillis()-ti;
		System.out.println("tempo decorrido (ms): " + ti);
	
	}
	
	public void doTest(double num){
	
		int decimalPlace = 2;
		BigDecimal bd = new BigDecimal(num);
		bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
		num = bd.doubleValue();
		System.out.println(num);
	}
}

hmm, seria melhor computar somente o tempo da conversão… aí tá contando SOPs tb etc…

[]'s

Math.ceil(double a);

Returns the smallest (closest to negative infinity) double value that is not less than the argument and is equal to a mathematical integer.

Math.floor(double a);

Returns the largest (closest to positive infinity) double value that is not greater than the argument and is equal to a mathematical integer.

** Agora é só fazer vezes 10 e passar como argumento.

decimal format tambem resolveria esse problema…

DecimalFormat decimal = new DecimalFormat( "0.00" ); System.out.println( decimal.format( 3.7691231233 ) );

Curiosamente o java nao tem um monte de funcoes para fp que existem em muitas outras linguagens, e arredondamento eh mais uma dessas.

Zuando o numero e multiplicando/dividindo, voce pode usar Math.rint().

poxa pessoal! agradeco muito mesmo!

Por que a formatação do resultado de System.out.println( decimal.format( 3.7691231233 ) ); é 3,77, ou seja, com vírgula e não ponto? (3.77) :oops:

Lig, experimente mudar o “regional settings” da sua máquina (presumo que você esteja usando Windows) para English / United States e veja o que acontece. É que esse método “format” obedece ao “Regional Settings”.

Pegando o bonde, como eu arredondo um float para um inteiro???
E 0.5 arredondado vira 0 ou 1??

class TestRound {
    public static void main(String[] args) {
        float[] samples = {
            0.5f, 0.7f, 0.8f, 1.0f, 1.5f, -1.5f, 1.3f, -1.3f, 1.51f, -1.51f, 1.6f
        };
        
        int n;
        for (int i = 0; i < samples.length; ++i) {
            n = Math.round (samples[i]);
            System.out.println (samples[i] + "-> " + n);
        }
    }
}

Rode o programa acima, e veja a saída. Dá para entender o que Math.round faz.

C>java -cp . TestRound
0.5-> 1
0.7-> 1
0.8-> 1
1.0-> 1
1.5-> 2
-1.5-> -1
1.3-> 1
-1.3-> -1
1.51-> 2
-1.51-> -2
1.6-> 2

Valeu Thingol! :thumbup:
Alterei o locale pelo pgm msm:
NumberFormat decimal = DecimalFormat.getInstance(Locale.ENGLISH);
E depois formatei as casas decimais:
decimal.setMinimumFractionDigits(2);
Té+.

Quando eu quero mudar de float ou double para int e arredondar eu tenho feito assim:

(int)(numero + 0.5)

hehehe :slight_smile:

Somar 0.5 e truncar é a definição de Math.round, tal como descrito no javadoc. É isso aí, dudaskank

Boa Tarde Galera! Aproveitando o Topico!
Estou com problema para configurar o regional setting no windows 2003 server, que esta em english language. Pois quando seto ele para Portugues(Brasil), nas configurações regional, e salvo as alterações. As configurações não vistas no Tomcat, na parte de Ponto Decimal. :frowning:
Alguém sabe como me ajudar…?

[quote=Hempx]decimal format tambem resolveria esse problema…

DecimalFormat decimal = new DecimalFormat( "0.00" ); System.out.println( decimal.format( 3.7691231233 ) );[/quote]

Esse trecho fodeu meu codigo cara :frowning:
kkkkk