[Resolvido] Como arredondar Media Final com regras especificas?

Boa Tarde Nobre colegas,

Estou desenvolvendo um sistema de consultas de notas, até então está indo bem, mas me foi solicitado para que as notas da media final sejam arredondadas.

Ex: Se a nota for 7,5 tem que se arredondar automaticamente para 8,0 e;
Se a nota for 7,3 tem que se arredondar automaticamente para 7,5.

Galera já procurei no forum e no google algo parecido mas não encontrei, por favor me ajudem!!!.

[]'s

Caraca , Não consegui pensar em nada a não ser fazer um monte de

double nota = aux;

if (aux > 7 &&  aux <=7.5) {
aux = 7.5;
}if (aux >1 && aux <=1.5){
aux = 1.5;
}

//Não consegui imaginar outro jeito...pode ser bem primitivo assim , mais funciona !
eu pensei com Switch case mais ai você implementaria mais código ainda  !

para 10 notas você teria 20 testes xD
com certeza esta não é a opção que deixara seu código mais limpo

Cara eu tb não consegui pensar em nada…rsrsr o trem ta tenso, mas eu entendi o primeiro if, só não entendi o segundo:

[quote]}if (aux >1 && aux <=1.5){
aux = 1.5;
} [/quote]

Se vc puder me explicar melhor agradeço.

A classe BigDecimal já possui funcionalidades pra isso:
http://www.guj.com.br/java/28463-arredondar-bigdecimal-para-proximo-inteiro-resolvido
Então não precisa quebrar muito a cachola. Dá uma lida ali, tem o modo de arredondamento: por média, pra cima, pra baixo, divirta-se hehe
Abraço!

no final das contas é so colocar:

int Media_arendodada=Math.round(Media)

Isso pode resolver o seu problema.

                float nota = 7.3f;
		String notaStr = nota+"";
		int pos = notaStr.indexOf(".")+1;
		int dec = Integer.parseInt(notaStr.substring(pos, pos+1));
		if(dec < 5){			
			double a = (5d-dec)/10d;			
			nota += a;
			System.err.println(nota);
		}else{
			System.err.println(new BigDecimal(nota).round(new MathContext(1)));
		}

mas se quizeres fazer a pau podes fazer o seguinte:

public static int Aredonda (float D){ int A=(int) D; float F= D-A; if(F>=0.5){ return (int)(D+1); } else return (int)D; }

[code]
private void arredondar() {
double i = 3.2;
int decimal = (int) (i10 - (int)i10);
if(decimal >= 3 && decimal < 5) {
System.out.println(Math.rint(i)+0.5);
}
else {
System.out.println(Math.rint(i));

	 }
 }[/code]

resolvido.

Ele vai ficar testando as condições e no if que ele entrar ele vai atribuir o valor a sua variável de acordo com o valor que você quer arredondar !
Exemplo de acordo com oque você quer arredondando de 1,1/1,2/1,3/1,4 para 1,5 E 1,5 vale ele mesmo !

fiz um teste aqui , repetindo ão conheço a API do bigDecimal igual o amigo falo deve ter métodos prontos para isto , é igual definir um padrão de data em 3 Strings dia,mes,ano
ou ussar a classe Date, já inventaram isso , mas por hora como não são taooo grandes as verificacões , voce poderia fazer assim.

package bean;

import javax.swing.JOptionPane;

public class testeNota {

	public static void main(String[] args) {

		double nota = Double.valueOf(JOptionPane
				.showInputDialog("Entre com a nota"));
		// se nota for maior que 1 e menor que dizer que ela é
		// 1,1||1,2||1,3||1,4mou igual a 1.5 ela vai valer 1.5
		if (nota > 1.5 && nota <= 1.5d)
			nota = 1.5d;
		else if (nota > 1.5d && nota <= 2.0d)
			nota = 2.0d;
		else if (nota > 2 && nota <= 2.5d)
			nota = 2.5d;
		else if (nota > 2.5d && nota <= 3.0d)
			nota = 3.0d;
		else if (nota > 3.0d && nota <= 3.5d)
			nota = 3.5d;
		else if (nota > 3.5d && nota <= 4.0d)
			nota = 4.0d;
		else if (nota > 4.0d && nota <= 4.5d)
			nota = 4.d;

		System.out.println(nota);
	}
}

mausexdd,

E se a escola resolver trabalhar com notas de 0 a 100, como fica? =p

Segue a solução que encontrei…

import javax.swing.JOptionPane;

public class TesteNotaArredondada {

    public static void main(String[] args) {

        double notaArredondada = 0.0;
        double nota = Double.valueOf(JOptionPane.showInputDialog("Entre com a nota"));
        int notaInteira = (int) nota;

        double resto = nota - notaInteira;

        System.out.println("Nota: " + nota);
        System.out.println("Nota inteira: " + notaInteira);
        System.out.println("Resto: " + resto);

        if (resto > 0) {
            if (resto <= 0.5) {
                notaArredondada = notaInteira + 0.5;
            }else{
                notaArredondada = notaInteira + 1;
            }
        }

        System.out.println("Nota arredondada: " + notaArredondada);
    }
}

[quote=Danillo_Moreno]Segue a solução que encontrei…

[code]
import javax.swing.JOptionPane;

public class TesteNotaArredondada {

public static void main(String[] args) {

    double notaArredondada = 0.0;
    double nota = Double.valueOf(JOptionPane.showInputDialog("Entre com a nota"));
    int notaInteira = (int) nota;

    double resto = nota - notaInteira;

    System.out.println("Nota: " + nota);
    System.out.println("Nota inteira: " + notaInteira);
    System.out.println("Resto: " + resto);

    if (resto > 0) {
        if (resto <= 0.5) {
            notaArredondada = notaInteira + 0.5;
        }else{
            notaArredondada = notaInteira + 1;
        }
    }

    System.out.println("Nota arredondada: " + notaArredondada);
}

}

[/code][/quote]

Seu codigo, ficou otimo, só que deu um errinho, se vc puder me explicar:

Nota: 7.5
Nota inteira: 7
Resto: 0.5
Nota arredondada: 7.5

Que erro, o meu código considera que qq nota entre X,1 e X,4 será “arredondada” para X,5… (Falso arredondamento, já que X,5 não é redondo… eheheh)

Qualquer nota entra X,6 e X,9 será arredondada pra cima…

Não era isso que vc queria???

Caros Amigos, foi solucionado essa duvida, a resposta do nosso colega ruben_m resolveu todo problema sem sujar o codigo, recomendo!

[quote=ruben_m]no final das contas é so colocar:

int Media_arendodada=Math.round(Media)

PS: Agradeço a todos pela ajuda!!!

[quote=PedroPauloPrudente]Caros Amigos, foi solucionado essa duvida, a resposta do nosso colega ruben_m resolveu todo problema sem sujar o codigo, recomendo!

[quote=ruben_m]no final das contas é so colocar:

int Media_arendodada=Math.round(Media)

PS: Agradeço a todos pela ajuda!!![/quote]

Para a descrição que você deu ao problema a solução proposta pelo ruben_m não é válida…
Você disse que:

[quote=PedroPauloPrudente]Estou desenvolvendo um sistema de consultas de notas, até então está indo bem, mas me foi solicitado para que as notas da media final sejam arredondadas.

Ex: Se a nota for 7,5 tem que se arredondar automaticamente para 8,0 e;
Se a nota for 7,3 tem que se arredondar automaticamente para 7,5.[/quote]

Usando o Math.round(Media), se você digitar 7,3 o arredondamento será 7 e não 7,5…

Acho o que Propus resolve sim… a segunda condição é meio estranha para calculo de Media, mas apartir da minha resolução é facil arranjar um Artificio que nos leve a solução.

[quote=ruben_m]Acho o que Propus resolve sim… a segunda condição é meio estranha para calculo de Media, mas apartir da minha resolução é facil arranjar um Artificio que nos leve a solução.

[/quote]

Ruben_m, não me entenda mal, não quis dizer que você está errado não… A sua solução está correta, o que eu disse ao autor do tópico que a descrição do problema dele não pode ser resolvida dessa maneira…

Isso de “arrendondar” um 7,3 para 7,5 é muito comum em notas escolares que quase sempre trabalham de 0,5 em 0,5 pontos…

a idéia do danilo de pegar só o valor inteiro , acho que funciona perfeitamente pois quando x for 0.5 ou numero redondo ele continuara sendo ele mesmo (Falso arredondamento)mas é válido !

Quando for notas de 0 a 100 faz = o amigo ai… xD
brincadeira , eu fui bem claro que era só para ele ir testando e pensando em como evoluir aquele monte de testes condicionais , oque eu esperava era um algoritimo similar ao do nosso amigo danilo :smiley:

Se o arredondamento tem que ser como ele citou no começo, realmente o Math.round não resolve…

agora se for só pra arredondar, então… deixa que o Math resolva pra você e a gente não perde tempo =p

A do Danilo tem um erro, se for informada uma nota inteira ele irá exibir 0.

ex: 7.0