Retornando valor errado

4 respostas
K

Estou fazendo um programa que calcula perimetro de uma reta foramado por dois pontos no plano cartesiano.
A formula para isso é Raiz((x2-x1)² + (y2-y1)²) .... oque estou fazendo errado ???

Por exemplo Raiz((4-1)² + (5-1)²) o resultado seria 5, mas ele imprime o resultado como 4,899.

String txtP1X = this.tf_P1X.getText();
            float valorP1X = Float.parseFloat(txtP1X);

            String txtP1Y = this.tf_P1Y.getText();
            float valorP1Y = Float.parseFloat(txtP1Y);

            String txtP2X = this.tf_P2X.getText();
            float valorP2X = Float.parseFloat(txtP2X);
            
            String txtP2Y = this.tf_P2Y.getText();
            float valorP2Y = Float.parseFloat(txtP2Y);

            result = (float) (Math.sqrt((Math.pow(2, (valorP2X-valorP1X))) + (Math.pow(2, (valorP2Y-valorP1Y)))));
            
            new SalvarFigura().setVisible(true);
            ID++;
            System.out.printf("Resultado: %.3f ",result);

4 Respostas

fredericomaia10

Cara não sei se é isso realmente. Mas tente usar BigDecimal para operações com números decimais, não float.

A forma de usar, por exemplo é:
BigDecimal numero1 = new BigDecimal("10.8");
BigDecimal numero2 = new BigDecimal("10.5");

BigDecimal resultado = numero1.multiply(numero2);

Meio verboso, mas funciona.

K
fredericomaia10:
Cara não sei se é isso realmente. Mas tente usar BigDecimal para operações com números decimais, não float. A forma de usar, por exemplo é:
BigDecimal numero1 = new BigDecimal("10.8");
BigDecimal numero2 = new BigDecimal("10.5");

BigDecimal resultado = numero1.multiply(numero2);

Meio verboso, mas funciona.

Não entendi como isso aplicaria no meu programa e como isso poderia me ajudar.
Tem como fazer essa modificação no código que postei lá em cima ???

ingridmarcal

Eu acho que o problema está acontecendo porque a ordem dos parâmetros passados para a função pow está invertido. O primeiro parâmetro é a base e o segundo parâmetro é o expoente.

Deveria ser:

float result = (float) (Math.sqrt((Math.pow((valorP2X-valorP1X),2 )) + (Math.pow((valorP2Y-valorP1Y),2))));

(Utilizando seu exemplo a expressão ficaria: ((4-1)² + (5-1)²) = 5)

e não:

float result = (float) (2,Math.sqrt((Math.pow((valorP2X-valorP1X))) + (2, Math.pow((valorP2Y-valorP1Y)))));

(Utilizando seu exemplo a expressão ficaria: (2^(4-1)) + (2^(5-1)) = 4.899)

Espero ter ajudado em algo… :smiley:

K
ingridmarcal:
Eu acho que o problema está acontecendo porque a ordem dos parâmetros passados para a função pow está invertido. O primeiro parâmetro é a base e o segundo parâmetro é o expoente. Deveria ser:
float result = (float) (Math.sqrt((Math.pow((valorP2X-valorP1X),2 )) + (Math.pow((valorP2Y-valorP1Y),2))));
(Utilizando seu exemplo a expressão ficaria: ((4-1)² + (5-1)²) = 5) e não:
float result = (float) (2,Math.sqrt((Math.pow((valorP2X-valorP1X))) + (2, Math.pow((valorP2Y-valorP1Y)))));
(Utilizando seu exemplo a expressão ficaria: (2^(4-1)) + (2^(5-1)) = 4.899)

Espero ter ajudado em algo... :D

Valeu cara, problema resolvido !!

-------------------------------------------------------------------------------------------------

Novo pipino aqui ....

Oque tem de errado aqui ???

private void jB_PerimetroActionPerformed(java.awt.event.ActionEvent evt) {                                             
        String txtRID = this.tf_RID.getText();
        int valorRID = Integer.parseInt(txtRID);    
        
        int nID = IDTotal[valorRID];
        int cont;
        if(nID == 1)
        {
            cont = 0;
            while(valorRID != IDCirculo[cont])
            {
                cont++;
            }
            String Valor = String.valueOf(VetorCirculo[cont]); 
            ValorPerimetro.setText(Valor);
        }
        
        else if(nID == 2)
        {
            cont = 0;
            while(valorRID != IDReta[cont])
            {
                cont++;
            }
            String Valor = String.valueOf(VetorReta[cont]); 
            ValorPerimetro.setText(Valor);
        }
        
        else if(nID == 3)
        {
            cont = 0;
            while(valorRID != IDTriangulo[cont])
            {
                cont++;
            }
            String Valor = String.valueOf(VetorTriangulo[cont]); 
            ValorPerimetro.setText(Valor);
        }
    }
Criado 7 de abril de 2013
Ultima resposta 7 de abr. de 2013
Respostas 4
Participantes 3