2015-11-11 3 views
1

Я пытаюсь напечатать область и периметр треугольника с заданной длиной. Однако я успешно напечатал правильный периметр, но моя область неправильная (выход области равен 0,00). Я понял, что это потеря точности ошибки, но я не могу ее решить. Кто-нибудь, пожалуйста, рассмотрит этот код и укажет на проблему, особенно на метод экземпляра, calculateArea? Спасибо.Потеря точности точности Java с формулой Герона

public class Triangle 
{ 
private int sideA=0, sideB=0, sideC=0, perimeter=0; 
private double area=0; 

public Triangle() 
{ 
} 
public Triangle(int a, int b, int c) 
{ 
    setSides(a,b,c); 
} 
public void setSides(int a,int b, int c) 
{ 
    sideA=a; 
    sideB=b; 
    sideC=c; 
} 
public void calculateArea() 
{ 
    int s; 
    s=(int)perimeter/2; 
    double area=Math.sqrt(s*(s-sideA)*(s-sideB)*(s-sideC)); 
} 
    public void calculatePerimeter() 
{ 
perimeter=sideA+sideB+sideC; 
} 
public void printTriangle() 
    { 
    System.out.printf("The triangle with sides %d , %d and %d has an area of %.3f and perimeter %d%n", sideA, sideB, sideC, area, perimeter); 
    } 
} 

Для справки (его не нужно исправить), вот мой другой код.

public class TriangleRunner 
{ 
public static void main(System[]args) 
{ 
    Triangle isoceles = new Triangle(); 
    isoceles.setSides(3,3,3); 
    isoceles.calculateArea(); 
    isoceles.calculatePerimeter(); 
    isoceles.printTriangle(); 

    Triangle right345 = new Triangle(); 
    right345.setSides(3,4,5); 
    right345.calculateArea(); 
    right345.calculatePerimeter(); 
    right345.printTriangle(); 
} 
} 

ответ

2

Вы используете perimeter в calculateArea, но рассчитывается только в calculatePerimeter, который еще не называется, так perimiter еще 0. Вы можете просто позвонить по телефону calculatePerimeter, прежде чем звонить calculateArea, но может быть лучше позвонить calculatePerimeter в calculateArea, чтобы убедиться, что он доступен вам.

Поскольку значение perimeter зависит от других значений, не рекомендуется иметь его в качестве переменной экземпляра. Вы можете вернуть это значение в calculatePerimeter, используя его как локальную переменную, когда это необходимо.

Кроме того, изменение s в calculateArea к double, и разделить на double буквального 2.0 вместо 2, чтобы заставить вычисления с плавающей точкой.

С этими изменениями я получаю правильный выход.

+0

спасибо. Мне просто интересно, как бы я назвал calcPerimeter в calcArea? – user41854

Смежные вопросы