Arredondamento de valores de meio em meio [RESOLVIDO]

11 respostas
flaviochess

Pessoal, boa tarde!

Estou com dificuldades com arredondamento de um Double… eu sei, eu sei, que tem diversos tópicos sobre isso, mas estou procurando um arredondamento específico:

Gostaria de saber se existe alguma função que faz o arredondamento onde o resultado seja o número “inteiro” X ou X.5.
É para um sistema de notas, e as notas só podem ser, por exemplo, 8 ou 8.5 e não 8.3.

Não sei se fui claro o suficiente :oops:

Se alguém puder me ajudar… obrigado!

11 Respostas

flaviochess

Ah, e só para complementar minha dúvida… o usuário entra com a nota da forma que quiser, o sistema que deve arredondar esta entrada antes de armazenar ou recuperar no banco.

Marcelo_de_Andrade

Uma pesquisada rápida pela WEB e você teria encontrado.

flaviochess

Obrigado, vou verificar…

Mas o que não faltou foi pesquisa… é que é fácil encontrar quando se sabe o que procurar 8)

Novamente obrigado!

viniciusalvess

você pode usar também BigDecimal http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html, que ja vem com as formar de arredondamento para setar de acordo com sua necessidade ;

Vingdel

flaviochess:
Pessoal, boa tarde!

Estou com dificuldades com arredondamento de um Double… eu sei, eu sei, que tem diversos tópicos sobre isso, mas estou procurando um arredondamento específico:

Gostaria de saber se existe alguma função que faz o arredondamento onde o resultado seja o número “inteiro” X ou X.5.
É para um sistema de notas, e as notas só podem ser, por exemplo, 8 ou 8.5 e não 8.3.

Não sei se fui claro o suficiente :oops:

Se alguém puder me ajudar… obrigado!

Aí vem minhas dúvidas:

Mas se as notas só podem ser 8.0, 8.5, 9.0, por que a pessoa tirou 8.3 ou 7.4?

E já que a pessoa tirou 7.2, por que o sistema vai armazenar como 7.0 ou 7.5? Não seria, injusto com outras pessoas que tiraram 7.1 ou 7.4, dependendo do critério de arredondamento?

Bom, após isso, acho que você mesmo pode criar um método para fazer isso, não tem complicação.

Abraço!

flaviochess

Vinicius e Vingdel, obrigado pelas dicas…

Eu não encontrei nenhuma função que faça exatamente o que eu queria (nem mesmo com a lista de “pesquisa rápida que eu teria encontrado” que o Marcelo passou).

Acredito que a solução para isso seja criar a minha própria função, assim como Vingdel disse!
Vou separa a casa decimal e realizar as verificações.

Danillo_Moreno
Vingdel

Olá, veja se assim te satisfaz...

double arredonda(double mnota){
		double n_arred = 0;
		double resto = (mnota*10)%10;
		if(resto > 0 && resto != 5){
			if(resto <= 2){
				n_arred = mnota - resto/10;
			}
			if(resto >= 6 && resto <= 7){
				n_arred = mnota - (resto-5)/10;
			}
			if(resto >= 8){
				n_arred = mnota + (10-resto)/10;
			}
			if(resto >= 3 && resto <= 4){
				n_arred = mnota + (5-resto)/10;
			}

		}else{
			n_arred = mnota;
		}
		return n_arred;
	}

Ou você quer arredondar sempre para cima?

Abraço!

flaviochess

É, entrando na questão que o modo é criarmos nosso próprio método, encontraríamos diversas formas de se fazer… tanto o método do Vingdel quanto o link passado pelo Danilo já resolve o problema.

Também fiz a minha própria, então segue mais uma alternativa:

double nota = 7.3;

double casaDecimal = (nota*10)%10; //dica do Danilo ^^
if((casaDecimal >= 3)&&(casaDecimal <= 7)){
	nota = (int)nota + 0.5;
}else{
	nota = Math.round(nota);
}

System.out.println(nota);

Agradeço a todos!

M

Só para constar, outra maneira de fazer (a que uso):

notaArredondada = Math.round(nota / 0.5) * 0.5;

Se a nota for 7.1, por exemplo:

7.1 / 0.5 = 14.2
round(14.2) = 14
14 * 0.5 = 7

Se for 7.4:

7.3 / 0.5 = 14.6
round(14.6) = 15
15 * 0.5 = 7.5

Se for um valor já arredondado (por exemplo 6.5):

6.5 / 0.5 = 13
round(13) = 13
13 * 0.5 = 6.5

flaviochess

Boa e velha matemática… muito boa a solução Marco e também a mais simples!
Vou substituir minha solução por esta! :smiley:

Criado 12 de outubro de 2011
Ultima resposta 16 de out. de 2011
Respostas 11
Participantes 6