Arredondamento de valores de meio em meio [RESOLVIDO]

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!

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.

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

Obrigado, vou verificar…

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

Novamente obrigado!

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 ;

[quote=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![/quote]

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!

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.

Olá, veja se assim te satisfaz…

[code] 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;
}[/code]

Ou você quer arredondar sempre para cima?

Abraço!

É, 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!

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

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: