[Resolvido] Como arredondar Media Final com regras especificas?

22 respostas
PedroPauloPrudente

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

22 Respostas

mausexdd

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

PedroPauloPrudente

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:

<blockquote>}if (aux >1 && aux <=1.5){

aux = 1.5;

}  </blockquote>

Se vc puder me explicar melhor agradeço.

leoramos

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!

ruben_m

no final das contas é so colocar:

int Media_arendodada=Math.round(Media)
joede.fadel

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)));
		}
ruben_m

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; }

lucasportela
private void arredondar() {
    	 double i = 3.2;
    	 int decimal = (int) (i*10 - (int)i*10);
    	 if(decimal &gt;= 3 && decimal &lt; 5) {
    		 System.out.println(Math.rint(i)+0.5);
    	 }
    	 else {
    		 System.out.println(Math.rint(i));
    		 
    	 }
     }

resolvido.

mausexdd

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);
	}
}
lucasportela

mausexdd,

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

Danillo_Moreno

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);
    }
}
PedroPauloPrudente
Danillo_Moreno:
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);
    }
}

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

Danillo_Moreno

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???

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

Danillo_Moreno

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

ruben_m:
no final das contas é so colocar:

int Media_arendodada=Math.round(Media)

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

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

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.

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

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.

Danillo_Moreno

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.

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…

mausexdd

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:

lucasportela

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

lucasportela

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

ex: 7.0

Danillo_Moreno

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

ex: 7.0

É só colocar um else no primeiro if…

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 &gt; 0) {
            if (resto &lt;= 0.5) {
                notaArredondada = notaInteira + 0.5;
            }else{
                notaArredondada = notaInteira + 1;
            }
        } else {
                notaArredondada = notaInteira;
       }

        System.out.println("Nota arredondada: " + notaArredondada);
    }
}
lucasportela
Danillo_Moreno:
lucasportela:
A do Danilo tem um erro, se for informada uma nota inteira ele irá exibir 0.

ex: 7.0

É só colocar um else no primeiro if...

import javax.swing.JOptionPane;

public class TesteNotaArredondada {

    public static void main(String[] args) {

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

        double resto = nota - notaInteira;

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

        if (resto &gt; 0) {
            if (resto &lt;= 0.5) {
                notaArredondada = notaInteira + 0.5;
            }else{
                notaArredondada = notaInteira + 1;
            }
        } else {
                notaArredondada = notaInteira;
       }

        System.out.println(&quot;Nota arredondada: &quot; + notaArredondada);
    }
}
import javax.swing.JOptionPane;

public class TesteNotaArredondada {

    public static void main(String[] args) {

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

        double resto = nota - notaInteira;

        System.out.println(&quot;Nota: &quot; + nota);
        System.out.println(&quot;Nota inteira: &quot; + notaInteira);
        System.out.println(&quot;Resto: &quot; + resto);
        
        notaArredondada = notaInteira;
        if (resto &gt; 0 ) {
            if (resto &lt;= 0.5) {
                notaArredondada = notaInteira + 0.5;
            }else{
                notaArredondada = notaInteira + 1;
            }
        }

        System.out.println(&quot;Nota arredondada: &quot; + notaArredondada);
    }
}
ggmoura

http://www.guj.com.br/posts/listByUser/15/51897.java

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

Criado 30 de agosto de 2011
Ultima resposta 26 de mar. de 2013
Respostas 22
Participantes 8