Ajuda pra resolver divisões inexatas

Daew galera, sou novato aqui, assim como no java, to ainda dando meus primeiros passos. Hoje escrevi um programinha bem simples pra calcular formulas bhaskara segue ele aki

import java.util.Scanner;

public class Bhaskara
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);

	int a;
	int b;
	int c;
	double xMenosRaiz;
	double xMaisRaiz;

	System.out.print ("usando este sistema você ira encontrar o 'x' da formula de Bhaskara\n");
	System.out.print ("a=x², b=x, c=numero sem variavel\n\n");

	System.out.print ("Insira o elemento a: ");
	a = input.nextInt();

	System.out.print ("Insira o elemento b: ");
	b = input.nextInt();

	System.out.print ("Insira o elemento c: ");
	c = input.nextInt();

	xMenosRaiz =  (-b +Math.sqrt (Math.pow (b,2) - 4*a*c))/2*a;
	xMaisRaiz =  (-b -Math.sqrt (Math.pow (b,2) - 4*a*c))/2*a;

	System.out.printf ("S={%.0f,  %.0f}", xMenosRaiz, xMaisRaiz );


}

}

Ele ta calculando certinha ate onde eu testei ele, porem quando é inserido alguma formula que o resultado seja uma fração ele remete a um resultado diferente por exemplo a seguinte fração
h(x)=10x²-29+10 o resultado deveria ser s{5/2, 2,5}, porem ele remete S{250,40}

Gostaria de saber como corigir isto, se tem como deixar o numero em fração ou ele dar a divisão correta ja que 5/2 = 2,5 e nao 250.
Valeu

use todas as variaveis como double, assim voce evita de perder precisão no meio dos calculos

:wink:

Benvindo.
Primeiramente, corrija teu tópico, conforme http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor

Depois, tem sim, caso você possua uma divisão inexata (ou seja x % i != 0) você só mostra o resultado na tela, em forma de fração.

ae vou dar um a analizada em seu codigo e em 5m respondo ok!

Pelo o que vi o problema é exatamente o que a MaYaRa_SaN disse

ele está fazendo toda a conta na direita como int, o resultado irá dar int, ai ele atribui esse valor int na variavel double,

trabalhando com todas variaveis double vai resolver o problema.

abraço

ae muito simples ele divide logo por 2 e n por 2*a
então vai ficar assim

xMenosRaiz = (-b + Math.sqrt((bb) - (4 * a * c))) / (2a);

xMaisRaiz = (-b - Math.sqrt((b*b) - (4 * a * c))) / (2 * a);

e todas as suas varieveis tem que ser double ok

Algumas alterações e utilizando as regras do fórum

import java.util.Scanner;

public class Bhaskara {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);

		double a;
		double b;
		double c;
		double xMenosRaiz = 0d;
		double xMaisRaiz = 0d;

		System.out
				.print("usando este sistema você ira encontrar o 'x' da formula de Bhaskara\n");
		System.out.print("a=x², b=x, c=numero sem variavel\n\n");

		System.out.print("Insira o elemento a: ");
		a = input.nextInt();

		System.out.print("Insira o elemento b: ");
		b = input.nextInt();

		System.out.print("Insira o elemento c: ");
		c = input.nextInt();

		System.out.println("Calculando " + a + "x² + (" + b + ")x + (" + c + ") = 0");
		
		double var1 = (-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c));
		double var2 = (-b - Math.sqrt(Math.pow(b, 2) - 4 * a * c));
		
		double dois = 2 * a;
		
		double sobra1 = var1 % dois;
		double sobra2 = var2 % dois;
		
		if (sobra1 == 0) {
			xMenosRaiz = (var1) / dois;
			System.out.println("X1 = " + xMenosRaiz);
		} else {
			System.out.println("X1 = " + var1 + "/" + dois);
		}
		if (sobra2 == 0) {
			xMaisRaiz = (var2) / dois;
			System.out.println("X2 = " + xMaisRaiz);
		} else {
			System.out.println("X2 = " + var2 + "/" + dois);
		}

	}
}

Detalhe, sempre que uma equação tiver como resposta uma fração, deve-se verificar se ambos os operandos podem ser divididos por algum divisor comum

x2 = 4.0/6.0
//como 4 e 6 são divisíveis por 2
//e
//4 / 2 = 2
//6 / 2 = 3
x2 = 2.0/3.0

E a saída

Insira o elemento a: -3
Insira o elemento b: 2
Insira o elemento c: 1
Calculando -3.0x² + (2.0)x + (1.0) = 0
X1 = 2.0/-6.0
X2 = 1.0

[quote=MaYaRa_SaN]use todas as variaveis como double, assim voce evita de perder precisão no meio dos calculos

;)[/quote]

Coloquei todas as variaveis em double, mas nao resolveu, continua dando o mesmo problema :confused:

[quote=wesllhey]ae muito simples ele divide logo por 2 e n por 2*a
então vai ficar assim

xMenosRaiz = (-b + Math.sqrt((bb) - (4 * a * c))) / (2a);

xMaisRaiz = (-b - Math.sqrt((b*b) - (4 * a * c))) / (2 * a);[/quote]

Tambem nao deu certo, ja que a pela procedencia ele multiplica 2*a e depois eles divide isso pela equação

[quote=drsmachado]Algumas alterações e utilizando as regras do fórum

import java.util.Scanner;

public class Bhaskara {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);

		double a;
		double b;
		double c;
		double xMenosRaiz = 0d;
		double xMaisRaiz = 0d;

		System.out
				.print("usando este sistema você ira encontrar o 'x' da formula de Bhaskara\n");
		System.out.print("a=x², b=x, c=numero sem variavel\n\n");

		System.out.print("Insira o elemento a: ");
		a = input.nextInt();

		System.out.print("Insira o elemento b: ");
		b = input.nextInt();

		System.out.print("Insira o elemento c: ");
		c = input.nextInt();

		System.out.println("Calculando " + a + "x² + (" + b + ")x + (" + c + ") = 0");
		
		double var1 = (-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c));
		double var2 = (-b - Math.sqrt(Math.pow(b, 2) - 4 * a * c));
		
		double dois = 2 * a;
		
		double sobra1 = var1 % dois;
		double sobra2 = var2 % dois;
		
		if (sobra1 == 0) {
			xMenosRaiz = (var1) / dois;
			System.out.println("X1 = " + xMenosRaiz);
		} else {
			System.out.println("X1 = " + var1 + "/" + dois);
		}
		if (sobra2 == 0) {
			xMaisRaiz = (var2) / dois;
			System.out.println("X2 = " + xMaisRaiz);
		} else {
			System.out.println("X2 = " + var2 + "/" + dois);
		}

	}
}

Detalhe, sempre que uma equação tiver como resposta uma fração, deve-se verificar se ambos os operandos podem ser divididos por algum divisor comum

x2 = 4.0/6.0
//como 4 e 6 são divisíveis por 2
//e
//4 / 2 = 2
//6 / 2 = 3
x2 = 2.0/3.0

E a saída

Insira o elemento a: -3
Insira o elemento b: 2
Insira o elemento c: 1
Calculando -3.0x² + (2.0)x + (1.0) = 0
X1 = 2.0/-6.0
X2 = 1.0

[/quote]

Vo da uma olhada nisso, quem sabe implementar o codigo, mas você disse que deve-se verificar sempre se uma fação tem um divisor comum, ate poderia ser, mas deve ter um resultado mesmo nao tendo divisores comuns. Queria que pelo menos se ele nao pudesse mostrar em fração que desse o resultado exato da divisão.

Outra coisa que poderia tentar fazer é: fazer o programa verificar se o resultado for inteiro, se nao for inteiro ele deixaria em forma de divisao mesmo, por exemplo se ao inves de ele tentar dividir 5/2 e retornar o resultado 2,5, ele simplesmente deixasse como 5/2

//faz isso ae que da
                 Scanner input = new Scanner(System.in);

		double a;
		double b;
		double c;
		double xMenosRaiz;
		double xMaisRaiz;

		System.out
				.print("usando este sistema você ira encontrar o 'x' da formula de Bhaskara\n");
		System.out.print("a=x², b=x, c=numero sem variavel\n\n");

		System.out.print("Insira o elemento a: ");
		a = input.nextInt();

		System.out.print("Insira o elemento b: ");
		b = input.nextInt();

		System.out.print("Insira o elemento c: ");
		c = input.nextInt();

		xMenosRaiz = (-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a);
		xMaisRaiz = (-b - Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a);

		System.out.println(xMaisRaiz);
		System.out.println(xMenosRaiz);

o problema era sua System.out.printf("S={%.0f, %.0f}", xMenosRaiz, xMaisRaiz);
^^mals por n ter avizado

[quote=wesllhey]o problema era sua System.out.printf("S={%.0f, %.0f}", xMenosRaiz, xMaisRaiz);
^^mals por n ter avizado[/quote]

Nops cara :confused: nao deu nao, a divisao de 5/2 continua dando 250 e a divisao de 2/5 continua dando 40. So para constar to usando o termo a=10 b=-29 c=10 o resultado seria S{5/2, 2/5}

kra copia e cola [code]public static void main(String[] args) {

	Scanner input = new Scanner(System.in);

	int a;
	int b;
	int c;
	double xMenosRaiz;
	double xMaisRaiz;

	System.out
			.print("usando este sistema você ira encontrar o 'x' da formula de Bhaskara\n");
	System.out.print("a=x², b=x, c=numero sem variavel\n\n");

	System.out.print("Insira o elemento a: ");
	a = input.nextInt();

	System.out.print("Insira o elemento b: ");
	b = input.nextInt();

	System.out.print("Insira o elemento c: ");
	c = input.nextInt();

	xMenosRaiz = (-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a);
	xMaisRaiz = (-b - Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a);
	
	System.out.println(xMenosRaiz);
	System.out.println(xMaisRaiz);


}[/code]

coloca 10 29 10 e vai dar -0.4 -2.5

coloca 10, -29, 10 vai dar 0.4 e 2.5 copia e cola n coloca mas nada alem disso ok ^^

[quote=wesllhey]kra copia e cola [code]public static void main(String[] args) {

	Scanner input = new Scanner(System.in);

	int a;
	int b;
	int c;
	double xMenosRaiz;
	double xMaisRaiz;

	System.out
			.print("usando este sistema você ira encontrar o 'x' da formula de Bhaskara\n");
	System.out.print("a=x², b=x, c=numero sem variavel\n\n");

	System.out.print("Insira o elemento a: ");
	a = input.nextInt();

	System.out.print("Insira o elemento b: ");
	b = input.nextInt();

	System.out.print("Insira o elemento c: ");
	c = input.nextInt();

	xMenosRaiz = (-b + Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a);
	xMaisRaiz = (-b - Math.sqrt(Math.pow(b, 2) - 4 * a * c)) / (2 * a);
	
	System.out.println(xMenosRaiz);
	System.out.println(xMaisRaiz);


}[/code]

coloca 10 29 10 e vai dar -0.4 -2.5[/quote]

Cara agora deu certo, ta dividindo tranquilo, e antes eu tinha tambem copiado e colado e nao dava… Mas agora ta tudo certo obrigadão ai cara

nada mano, ae se quiser aprender mas coisas e tirar duvidas pode me add ae no msn

wesllhey@hotmail.com

Só lembrando. Caso queira fazer cálculos com números decimais, sem perder a precisão dos mesmos, utilize a classe BigDecimal.

[]'s.

[quote=Koala]Vo da uma olhada nisso, quem sabe implementar o codigo, mas você disse que deve-se verificar sempre se uma fação tem um divisor comum, ate poderia ser, mas deve ter um resultado mesmo nao tendo divisores comuns. Queria que pelo menos se ele nao pudesse mostrar em fração que desse o resultado exato da divisão.

Outra coisa que poderia tentar fazer é: fazer o programa verificar se o resultado for inteiro, se nao for inteiro ele deixaria em forma de divisao mesmo, por exemplo se ao inves de ele tentar dividir 5/2 e retornar o resultado 2,5, ele simplesmente deixasse como 5/2[/quote]

Você nem tentou rodar o código, pelo visto.

Segundo, o comentário é apenas uma curiosidade.
Em vários concursos e vestibas, onde as questões são múltipla escolha, sempre tem aquela que mostra o resultado simplificado (esse processo de ir dividindo até chegarmos a fatores indivisíveis por denominadores comuns). Você pode ignorar (afinal, não sei se vale o tempo para implementar isso).