使用Heron公式的Java精度损失

时间:2015-11-11 01:01:29

标签: java

我正在尝试使用给定的长度打印三角形的区域和周长。我已经成功打印了正确的周长,但是我的区域不正确(该区域的输出为0.00)。我意识到这是一个精度错误的损失,但我无法解决它。有人请检查这段代码并指出问题,特别是在实例方法,calculateArea?谢谢。

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

1 个答案:

答案 0 :(得分:2)

您在perimeter中使用calculateArea,但这仅在calculatePerimeter中计算,但尚未调用,因此perimiter仍然是{{1} }}。您可以在致电0之前先致电calculatePerimeter,但最好拨打calculateArea中的calculatePerimeter以确保您可以使用{。}}。< / p>

因为calculateArea值取决于其他值,所以将它作为实例变量并不是一个好主意。您可能希望在perimeter中返回该值,并在必要时将其用作局部变量。

另外,将calculatePerimeter中的s更改为calculateArea,然后除以double文字double而不是2.0,以强制浮点计算。

通过这些更改,我得到了正确的输出。